【问题标题】:Constant padding in VerilogVerilog 中的常量填充
【发布时间】:2020-04-20 05:57:34
【问题描述】:

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

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

Icarus Verilog 给了我

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

但是,根据this website(以及我正在学习的 FPGA 课程的讲师)的说法,

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

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

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

【问题讨论】:

    标签: language-lawyer verilog constants system-verilog iverilog


    【解决方案1】:

    SystemVerilog IEEE 1800-2017 说:

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

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

    关于表达式结果的转换,标准说:

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

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

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

    【讨论】:

      【解决方案2】:

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

      只有 IEEE 标准的latest version 是免费提供的——必须购买旧版本。这个website 显示了最近对 SystemVerilog 标准的更改。

      【讨论】:

      • 只是好奇,SystemVerilog 被认为是 Verilog 的最新版本,还是它们是不同的语言?
      • 是的,IEEE 1800-2009 取代了 IEEE 1364-2005。除了新的关键字和勘误表,SystemVerilog 完全向后兼容早期版本的 Verilog。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多