【问题标题】:My testbench always shows X as the outputs我的测试台总是显示 X 作为输出
【发布时间】:2021-09-04 13:02:24
【问题描述】:

我无法识别错误,但所有代码在逻辑和语法上似乎都是正确的。测试台中sumcarry 的值始终为X。 有两个模块,一个用于 8 位加法器,另一个用于 16 位加法器:

module adder_8(in1 , in2 , cin , sum , carry);

input [7:0] in1 , in2;
input cin;
output reg [7:0] sum;
output reg carry;

always @(in1 or in2) begin
    {carry , sum} = in1 + in2 + cin;
end
endmodule

module adder_16(input_a , input_b , c , summation , cout);

input [15:0] input_a , input_b;
input c;
output [15:0] summation;
output cout;

wire t1;

adder_8 inst1 (input_a[7:0] , input_b[7:0] , c , summation[7:0] , t1);
adder_8 inst2 (input_a[15:8] , input_b[15:8] , t1 , summation[15:8] , cout);

endmodule

测试台文件是:

module testbench;

reg [15:0] a,b;

wire [15:0] sum;
wire carry;

parameter zero = 1'b0;

adder_16 ex(a , b , zero , sum , carry);

initial begin

    $monitor($time," A = %d , B = %d sum = %d carry = %b", a , b , sum , carry);

    #10 a = 16'd 100; b = 16'd 100;

    #10 a = 16'd 50; b = 16'd 20;

    #20 $finish;

end
endmodule

非常感谢您的帮助。

【问题讨论】:

    标签: module verilog system-verilog test-bench


    【解决方案1】:

    cinalways @(in1 or in2) 的敏感度列表中缺失。它应该是 always @(in1 or in2 or cin) 以补充 1995 版标准。 2001 版标准将其改进为 always @*(或同义词 always @(*) 用于自动敏感度列表。

    如果您的目标是 SystemVerilog,请使用 always_comb(没有 @ 或信号列表)。这将添加一个额外的编译时间检查,以确保逻辑没有分配到另一个 always 块中,这会使代码非合成器。

    【讨论】:

    • 谢谢...该程序现在运行良好。但是为什么这会影响 tesbench 中“sum”的值?
    • 在 Verilog 中,任何事物加上未知数的默认行为都是未知的(例如 4'd10 + 1'bx 将返回 4'bxxxx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多