Verilog不显示输出

时间:2015-02-18 23:07:51

标签: verilog system-verilog

我有一个家庭作业问题,我应该为单精度IEEE-754浮点乘法创建一个模块。这是模块:

module prob3(a, b, s);

input [31:0] a, b; // operands
output reg [31:0] s; // sum - Could potentially use wire instead
integer i; // loop variable
reg [8:0] temp;
reg [47:0] intProd; // intermediate product
reg [23:0] tempA;
reg [23:0] tempB;

initial begin

    //Initialization
    for (i = 0; i < 48; i = i + 1) begin
        intProd[i] = 0;
    end

    //Compute the sign for the result
    if (a[31]^b[31] == 0) begin
        s[31] = 0;
    end
    else begin
        s[31] = 1; 
    end

    //Compute the exponent for the result
    #10 temp = a[30:23] + b[30:23] - 8'b11111111;
    //Case for overflow
    if(temp > 8'b11111110) begin
        s[30:23] = 8'b11111111;
        for (i = 0; i < 23; i = i + 1) begin
            s[i] = 0;
        end
        $finish; 
    end
    //Case for underflow
    else if (temp < 8'b00000001) begin
        for (i = 0; i < 31; i = i + 1) begin
            s[i] = 0;
        end
        $finish;
    end
    else begin
        s[30:23] = temp[7:0];
    end

    //Mutliply the signficands

    //Make implicit one explicit
    tempA[23] = 1;
    tempB[23] = 1;

    //Make operands 24 bits
    for(i = 0; i < 23; i = i + 1) begin
        tempA[i] = a[i];
        tempB[i] = b[i];
    end

    //Compute product of signficands
    intProd = tempA * tempB;

    //Check and see if we need to normalize
    if(intProd[47:46] >= 2'b10) begin
        intProd = intProd >> 1;
        temp = s[30:23] + 1'b1;
        if(temp > 8'b11111110) begin
            s[30:23] = 8'b11111111;
            for (i = 0; i < 23; i = i + 1) begin
                s[i] = 0;
            end
            $finish;  
        end
        else
            s[30:23] = temp[7:0];
    end
    s[22:0] = intProd[47:25];
end
endmodule

这是我的测试平台:

module prob4;

reg [31:0] a, b;
wire [31:0] s;

// instantiate the floating point multiplier
prob3 f1(a, b, s);

initial begin

    assign a = 32'h42055555;
    assign b = 32'hBDCCCCCD;

    #10 $monitor("s = %h", s);

    assign a = 32'hBF555555;
    assign b = 32'hCAB71B00;

    #10 $monitor("s = %h", s);


    a = 32'hFF500000;
    b = 32'h7E700000;

    #10 $display("s = %b", s);

    a = 32'h01700000;
    b = 32'h02F00000;

    #10 $display("s = %b", s);

    a = 32'hBE000000;
    b = 32'h455F36DB;

    #10 $display("s = %b", s);

    a = 32'h3C800000;
    b = 32'h3A800000;

    #10 $display("s = %b", s);

    a = 32'hC797E880;
    b = 32'hB7FBA927;

    #10 $display("s = %b", s);

end

endmodule

它显示s的第一个值,但就是这样。老实说我对Verilog并不太熟悉,所以对于为什么会发生这种情况的任何澄清都会非常感激。

1 个答案:

答案 0 :(得分:1)

您只看到s的单个值的原因是因为所有浮点逻辑(prob3模块中的所有内容)都在初始块内。因此,您只运行一次该代码;它从0开始,暂停10个单位并结束;永远不要再跑了。以下是实现单元的一些技巧(假设模块可以合成而不仅仅是功能验证模型):

  • 将组合逻辑放在always @(*)块中,而不是初始块。

  • 如上所述,只需调用$monitor一次,只要s或作为参数给出的任何其他变量发生变化,它就会通知您;因此,您不需要$display语句,除非您想知道s在该执行点的值(无论是否更改并与进程内联,因此不一定是最终值) )。因此,通常您的测试平台主刺激初始块将$monitor()作为第一行。

  • 不要在逻辑中调用$finish;理想情况下,您应该设置一个错误信号,而不是如果它看到错误信号被断言,那么测试平台可能会选择调用$finish

  • 不要在程序块内部使用assign(always,initial等),只需说a = ...而不是assign a = ...