例如,说我有一个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/