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

10-12 20:42