在 EDA 游乐场的测试台中分配不更新结果值

assign not updating result value in testbench in EDA playground

我正在使用 EDA Playground 和 Aldec Riviera 模拟器,我这里有这个模块:

module alu(input  logic [31:0] a, b,
           input  logic [2:0]  alucontrol,
           output logic [31:0] result,
           output logic        zero);
  
  logic [31:0] condinvb, sum;

  assign condinvb = alucontrol[2] ? ~b : b;
  assign sum = a + condinvb + alucontrol[2];
 
  always_comb
    case (alucontrol[1:0])
      2'b00: result = a & b;
      2'b01: result = a | b;
      2'b10: result = sum;
      2'b11: result = sum[31];
    endcase

  assign zero = (result == 32'b0);
endmodule

我的测试台在这里:

module alu_testbench();
  logic [31:0] a,b;
  logic [2:0] alucontrol;
  logic [31:0] result;
  logic zero, clk;
  
  alu test_alu(a,b,alucontrol);
  
  initial begin
    $dumpfile("dump.vcd"); $dumpvars(1);
    clk = 0;
    a = 'hdead0000; b = 'h0000beef; alucontrol = 'b010; #1;
    a = 'hc0debabe; b = 'h0000ffff; alucontrol = 'b000; #1;
    a = 'hc0de0000; b = 'h0000babe; alucontrol = 'b001; #1;
    a = 'hc0debabe; b = 'h0000babe; alucontrol = 'b100; #1;
  end
  
  always begin
    #1; clk = ~clk;
  end
endmodule 

当我 运行 测试台并查看生成的波形时,我没有看到 result 正在更新。相反,它保持为 XXXX_XXXX。我在测试台上做错了什么?

在测试台中,您声明了 result 信号,但它没有连接到任何东西。您可能希望它由同名的 alu 输出驱动。在这种情况下,您应该将其连接到实例:

变化:

  alu test_alu(a,b,alucontrol);

至:

  alu test_alu(a,b,alucontrol,result,zero);

在 edaplayground 的其他模拟器上尝试您的代码;您应该收到有关未连接端口的警告。

使用您的代码,如果您查看 alu 实例内部,result 信号将不是 X。


另一种对实例进行编码的等效方法是按名称使用连接:

alu test_alu (
    .a           (a),
    .b           (b),
    .alucontrol  (alucontrol),
    .result      (result),
    .zero        (zero)
);

这样可以更轻松地避免常见的连接错误。