为什么 'd0 不扩展信号的整个宽度(就像 '0 那样)?

Why doesn't 'd0 extend the full width of the signal (as '0 does)?

使用SystemVerilog和Modelsim SE 2020.1,我很惊讶地看到一个行为:

bus_address 是一个 64b 信号 input logic [63:0] bus_address

使用'0

.bus_address ('0),

使用 'd0

.bus_address ('d0),

Riviera-Pro 2020.04(bug太多,我们放弃使用它,我们与Aldec有争议)

Investigation/Answer:

The number of bits that make up an unsized number (which is a simple decimal number or a number with a base specifier but no size specification) shall be at least 32. Unsized unsigned literal constants where the high-order bit is unknown ( X or x ) or three-state ( Z or z ) shall be extended to the size of the expression containing the literal constant.

这很棘手,我认为它会像 '0 那样设置 0 所有其他位。

我希望规范的作者在定义这种无意义的行为时多考虑一下。

这个问题与 大小不匹配的端口连接有关 比与数字文字有关。只是在使用填充文字时问题不会出现。这是因为填充文字会自动调整自身大小以消除端口宽度不匹配。

无论您是使用文字还是像本例中那样的其他信号,您看到的问题都存在:

module top;
  wire [31:0] a = 0;
  dut d(a);
endmodule
module dut(input wire [63:0] p1);
  initial $strobeb(p1);
endmodule

根据 23.3.3.7 不同网络类型的端口连接(网络和端口折叠),网络 ap1 可能会合并进入单个 64 位网络,但只有较低的 32 位仍然被驱动,或者 64'hzzzzzzzz00000000.

如果将端口连接更改为大小文字 dut d(32'b0);,您会看到相同的行为 64'hzzzzzzzz00000000

现在让我们回到未调整大小的数字文字 'd0Unsized 是用词不当——所有数字都有大小。只是大小是隐式的,而不是你想要的大小。有多少人写 {'b1,'b0,'b1,'b0} 时认为他们只是写了与 4'b1010 相同的东西?这在 LRM 中实际上是非法的,但一些工具会默默地将其解释为 {32'b1,32'b0,32'b1,32'b0}.

切勿使用大小不一的文字。