2010-11-14 29 views
6

我正在爲Verilog中的計算機體系結構創建的處理器開發簡單的簽名擴展器。如何在Verilog中籤名擴展數字

這裏是我到目前爲止有:[編輯:改變了選擇語句稍有]

`timescale 1ns/1ps 

module SignExtender(CLK, extend, extended); 
input[7:0] extend; 
input CLK; 
output[15:0] extended; 

reg[15:0] extended; 
wire[7:0] extend; 

always 
begin 
    while (CLK == 1) 
    extended[7:0] = extend[7:0]; 
    extended[15:8] = {8{extend[7]}}; 
end 
endmodule 

我加了一段時間(CLK == 1),這將解決我的問題,我相信這是思考一個無限循環。當我嘗試在iSim中測試時,電路從未初始化。

我還試圖消除複製的語法和只是做擴展[8] =延長[7]等爲[8] - [15],但同樣的結果發生,所以我很肯定的是,最內層的語法是正確的。

這裏的測試文件:

`timescale 1ns/1ps 
module SignExtender_testbench0; 

    // Inputs 
    reg [7:0] extend; 
    reg CLK; 

    // Outputs 
    wire [15:0] extended; 

    // Instantiate the Unit Under Test (UUT) 
    SignExtender uut (
     .extend(extend), 
     .extended(extended) 
    ); 

    initial begin 
     // Initialize Inputs 
     extend = 0; 

     #100; // Wait 100 ns for global reset to finish 

     extend = -30; 
     CLK = 1; 
     #10; 
     CLK = 0; 
     if (extended == -30) 
      $display("okay 1"); 
     else 
      $display("fail 1"); 

     extend = 40; 
     #10; 
     if (extended == 40) 
      $display("okay 2"); 
     else 
      $display("fail 2"); 

    end 

endmodule 

任何想法如何,我可以成功地做到這一點?

+0

看你的'開始'和結束'... – Marty 2010-11-14 10:36:23

回答

13

你近了... ...

always @(posedge clk) begin 
    extended[15:0] <= { {8{extend[7]}}, extend[7:0] }; 
end 

你也缺少了「40」測試時鐘邊緣。試試這個,&讓我知道你上車......

+0

謝謝,這確實是我失蹤! – 2010-11-14 09:18:01

10

我們可以使用語法$signed簽署延長

module signextender(
    input [7:0] unextended,//the msb bit is the sign bit 
    input clk, 
    output reg [15:0] extended 
); 

[email protected](posedge clk) 
    begin 
    extended <= $signed(unextended); 
    end 
endmodule 
+1

請注意,有些工具會提出有關寬度不匹配的警告,因爲'$ signed(未擴展)'在被加載到'extended'之前仍然只有8位 – minexew 2017-11-24 16:23:58

2

順便說你的模塊分配是純組合因此它不應該包含CLK ,這是做你的模塊的另一種方式:

module sign_ext 
      (
       unextend, 
       extended 
      ); 

input [15:0] unextend; 
output [31:0] extended; 

assign extended = {{16{unextend[15]}}, unextend}; 

endmodule 

//TB 

module tb_sign_ext; 

reg [15:0] unex; 
wire [31:0] ext; 

sign_ext TBSIGNEXT 
        (
        .unextend(unex), 
        .extended(ext) 
       ); 

initial 
begin 
    unex = 16'd0; 
end 


initial 
begin 
    #10 unex = 16'b0000_0000_1111_1111; 
    #20 unex = 16'b1000_0000_1111_1111; 
end 

endmodule 

;) 
相關問題