hop*_*ops 3 verilog system-verilog
这是一个简单的问题,但我之前没有真正看到答案.在Verilog(或SystemVerilog)中,可以声明一个文字并指出使用的位数.一些例子是:
reg [3:0] x = 4'b1101; // (1)
reg [3:0] y = 4'd13; // (2)
Run Code Online (Sandbox Code Playgroud)
这里声明了寄存器x和y,它们最初保持相同的值.还可以使用带符号的修饰符.使用它的一些例子是:
reg signed [3:0] a = 4'sb0101; // (3)
reg signed [3:0] b = 4'sd5; // (4)
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是如何使用十进制表示法表示负值.假设我们想要将寄存器c和d初始化为-3.它是否正确?
reg signed [3:0] c = 4'sb1101; // (5)
reg signed [3:0] d = -4'sd3; // (6)
Run Code Online (Sandbox Code Playgroud)
上面的代码在我当前版本的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
Run Code Online (Sandbox Code Playgroud)