verilog - 为什么有负值有符号文字?

标签 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 有何不同?

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

最佳答案

您可以使用 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

关于verilog - 为什么有负值有符号文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42911923/

相关文章:

verilog - 请解释一下这个 SystemVerilog 语法 {>>byte{...}}

case - Verilog case 语句中的多个项目匹配

code-coverage - 切换未收集覆盖范围

verilog - Vivado 2016.2 模拟器不支持 System Verilog $cast 或 $sformatf

在 System Verilog 中打印打包结构

system-verilog - 如何使用系统verilog中的定义形成变量名称

regex - 如何编写正则表达式来匹配 Verilog 文件中的模块实例化?

verilog - 是否有系统 verilog 任务返回 reg/logic 的长度?

verilog - 如何使用 Verilog 任务将值输出到寄存器?

module - 将参数传递给 Verilog 模块