为什么有负值有符号文字?
Why have negative-valued signed literals?
这是一个简单的问题,但我之前还没有真正看到答案。在 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
相比有何优势(或不同之处)?
替代解决方案:告诉我如何以更好的方式表示负值有符号文字。
您可以使用 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
-4'sd3
和-4d3
都一样。
如果包含 s 指示符,则使用基本格式指定的数字应被视为有符号整数,如果仅使用基本格式,则应被视为无符号整数。
The s designator does not affect the bit pattern specified, only its
interpretation. A plus or minus operator preceding the size constant
is a unary plus or minus operator. A plus or minus operator between
the base format and the number is an illegal syntax.
8'd-6 // this is illegal syntax
-4'sd15 // -15, equivalent to -4'd15, or '0001'
16'sd? // the same as 16'sbz
这是一个简单的问题,但我之前还没有真正看到答案。在 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
相比有何优势(或不同之处)?
替代解决方案:告诉我如何以更好的方式表示负值有符号文字。
您可以使用 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
-4'sd3
和-4d3
都一样。
如果包含 s 指示符,则使用基本格式指定的数字应被视为有符号整数,如果仅使用基本格式,则应被视为无符号整数。
The s designator does not affect the bit pattern specified, only its interpretation. A plus or minus operator preceding the size constant is a unary plus or minus operator. A plus or minus operator between the base format and the number is an illegal syntax.
8'd-6 // this is illegal syntax
-4'sd15 // -15, equivalent to -4'd15, or '0001'
16'sd? // the same as 16'sbz