【问题标题】:Why have negative-valued signed literals?为什么有负值有符号文字?
【发布时间】:2017-03-20 19:02:58
【问题描述】:

这是一个简单的问题,但我之前还没有真正看到答案。在 Verilog(或 SystemVerilog)中,可以声明一个文字并指示使用的位数。一些例子是:

reg [3:0] x = 4'b1101; // (1)
reg [3:0] y = 4'd13;   // (2)

这里声明了寄存器 x 和 y,它们最初的值相同。还有一个可以使用的带符号修饰符。一些使用它的例子是:

reg signed [3:0] a = 4'sb0101; // (3)
reg signed [3:0] b = 4'sd5;    // (4)

现在,我的问题是如何使用十进制表示法表示负值。假设我们要将寄存器 c 和 d 初始化为 -3。它是否正确?

reg signed [3:0] c = 4'sb1101; // (5)
reg signed [3:0] d = -4'sd3;   // (6)

以上代码在我当前版本的 ActiveHDL 中编译和运行。对我来说,它似乎在语义上暗示了以下内容:数字 0011 的表示被否定(位反转并添加一个)以获得 1101(我想要表示的实际文字)。请注意,我们在此使用了否定运算符。我经常想知道是否有另一种方法可以直接表示数字。我试过4'sd(-3),这对我来说似乎更干净,因为现在宽度和表示的值已经解耦了。但是,这给了我语法错误。我已经在标有 (6) 的初始化中解决了问题,但这仍然引出了问题......

如果指定宽度的文字不能包含负值(没有运算符作用于它们),为什么还要为指定宽度的文字使用带符号的修饰符?

换句话说,文字 -4'sd3 与文字 -4'd3 相比如何(或只是不同)?

替代解决方案:告诉我如何以更好的方式表示负值有符号文字。

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您可以使用4'(-3) 这将表达式转换为指定的宽度,4。

    正如 LRM 所述,s 修饰符不会影响所表示的位模式;只是它的解释。如果你有它会有所作为

    module top;
    
      reg signed  [5:0] a;
      initial begin
        a = -4;
        $display(a<4'b1101);
        $display(a<4'sb1101);
      end
    endmodule
    

    【讨论】:

    • 这是一个有趣的选择。在连接有符号值时,我已经使用过很多次了。在我写这个问题时,我没有想到。负号是否意味着最终值将被视为在表达式中签名?所以像 a = b * 4'(-1) 这样的东西会导致有符号的乘法(假设 b 是有符号的)?我想我可以自己试试。
    • 是的,LRM 说签名通过不变。
    【解决方案2】:

    -4'sd3-4d3 都是一样的。

    如果包含 s 指示符,则使用基本格式指定的数字应视为有符号整数,如果仅使用基本格式,则应视为无符号整数。

    s 指示符不影响指定的位模式,只影响它的 解释。大小常量前面的加号或减号运算符 是一元加号或减号运算符。之间的加号或减号运算符 基本格式和数字是非法语法。

        8'd-6   // this is illegal syntax
        -4'sd15 // -15, equivalent to -4'd15, or '0001'
        16'sd?  // the same as 16'sbz
    

    【讨论】:

    • 卡兰,我假设你的意思是说 -4'sd3 和 -4'd3 是一样的? (您缺少 ' 字符。)不过感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2015-10-31
    • 2020-06-02
    相关资源
    最近更新 更多