例如,假设我有一个 reg [7:0] myReg
我给它赋值 -8'D69
我知道 Verilog 将它存储为 2 的补码,所以它应该存储为
10111011
我现在的问题是是否要对其执行操作,例如 myReg/2
它会评估为-34吗?还是需要将 10111011 变成 187 然后执行除法,返回 93?
最佳答案
你需要记住 -8d69
只是一个位模式。 reg 是一种保存位模式的类型。是指示 /
的变量类型执行有符号或无符号算术。
如果这是为了综合考虑您想尝试避免使用分隔符,那么您真的想尝试避免使用带符号的分隔符。它可能会用 >>> 1
合成更小
reg [7:0] a;
reg signed [7:0] b;
reg [7:0] c;
reg signed [7:0] d;
initial begin
a = -8'd69 ;
b = -8'd69 ;
c = -8'd69 ;
d = -8'd69 ;
#10ns;
a = a/2 ;
b = b/2 ;
#10ns;
$display("a : %8b, %d", a, a);
$display("b : %8b, %d", b, b);
$display("c >>>1 : %8b, %d", c>>>1, c>>>1);
$display("d >>>1 : %8b, %d", d>>>1, d>>>1);
end
给出:
a : 01011101, 93
b : 11011110, -34
c >>>1 : 01011101, 93
d >>>1 : 11011101, -35
>> x
右移 x 位,>>> x
右移 x 位,但符号扩展为有符号类型。注意:
/2
在我的例子中也是四舍五入,>>>
将向下舍入/截断。
关于verilog - Verilog 如何处理负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399991/