为什么要使用负值的签名文字?

时间:2017-03-20 19:02:59

标签: verilog system-verilog

这是一个简单的问题,但我之前没有真正看到答案。在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(或只是不同)?

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

2 个答案:

答案 0 :(得分:5)

您可以使用ALTER ASSEMBLY这会将表达式转换为指定的宽度,4。

正如LRM所述,4'(-3)修饰符不会影响所表示的位模式;只是它的解释。如果你有

会有所作为
s

答案 1 :(得分: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