1

这是有问题的示例行为 Verilog 代码

module constant;
    reg [7:0] foo;
    initial begin
        foo = 1'bz;
        $display("%H", foo);
    end
endmodule

伊卡洛斯 Verilog 给了我

$ iverilog -o constant constant.v
$ ./constant
0Z

但是,根据这个网站(以及我正在学习的 FPGA 课程的讲师),

如果 number 小于 size 常数,那么它将用零填充到左侧。如果指定数字的最高有效位具有未知 (x) 或高阻抗 (z) 值,则该值将用于向左填充。

在这种情况下,输出应该是ZZ而不是0Z. 我很确定这是由于规范的变化(可能是ZZ在 Verilog 1995 和0ZVerilog 2001 中,或其他),但是导致每种行为的标准是什么?我曾尝试在线搜索规范,但它们似乎不是免费提供的,例如需要购买或订阅的规范。

作为奖励,我在哪里可以找到 Verilog 各种规格的变化摘要?

4

2 回答 2

3

SystemVerilog IEEE 1800-2017 说:

如果无符号数的大小小于为字面常量指定的大小,则应将无符号数向左填充零。如果无符号数的最左边位是 x 或 az,则应使用 x 或 az 分别向左填充。如果无符号数的大小大于为文字常量指定的大小,则应从左侧截断无符号数。

但是,这里的数字不小于大小常数——这里的大小是 1'bz 中的“1”。

在表达结果的转换方面,标准中说:

从较少位数到较大位数的自动类型转换涉及无符号的零扩展或有符号的符号扩展。从大量位到少量位的自动类型转换涉及截断最高有效位 (MSB)。

由于这是一个无符号表达式和结果,因此 1'bz 文字表达式随后被零扩展以适应 foo 的 8 位大小。

IEEE 1800-2017 可供所有人从 IEEE 网站免费下载。

于 2020-04-20T06:53:42.847 回答
1

我相信您会混淆数字文字(如8'bz)与表达式中的值会发生什么。数字文字将填充指定的zz指定的宽度。但是一旦在一个表达式中,无符号值会被填充为 0,而有符号值会被填充,就像你的讲师所说的那样。

只有最新版本的 IEEE 标准是免费提供的——旧版本必须购买。该网站显示了 SystemVerilog 标准的最新更改。

于 2020-04-20T15:34:07.503 回答