verilog中的'<<运算符

bir*_*n.K 5 verilog operator-keyword

我有一个verilog代码,其中有一行如下:

parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
Run Code Online (Sandbox Code Playgroud)

这里将存储RAM_DEPTH什么以及<<操作员在这里做什么.

Mor*_*gan 18

<< 是一个二进制移位,向左移动1个位置.

4'b0001 << 1 => 4'b0010
Run Code Online (Sandbox Code Playgroud)

>>是一个二进制右移,将0添加到MSB.
>>>是一个有符号的移位,如果左输入被签名,它将保持MSB的值.

4'sb1011 >>  1 => 0101
4'sb1011 >>> 1 => 1101
Run Code Online (Sandbox Code Playgroud)

签名左操作数的三种方式是签名:

module shift;
  logic        [3:0] test1 = 4'b1000;
  logic signed [3:0] test2 = 4'b1000;

  initial begin
    $display("%b", $signed(test1) >>> 1 ); //Explicitly set as signed
    $display("%b", test2          >>> 1 ); //Declared as signed type
    $display("%b", 4'sb1000       >>> 1 ); //Signed constant
    $finish;
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

  • 如果已移位的操作数已签名,则>>>运算符仅保留MSB.如果移位的操作数是无符号的,如在您的示例中,>>>运算符就像>>运算符一样插入零. (2认同)

e19*_*001 6

1 << ADDR_WIDTH意味着1将向左移8位并将其指定为值RAM_DEPTH.

另外,1 << ADDR_WIDTH也意味着2 ^ ADDR_WIDTH.

鉴于ADDR_WIDTH = 8,然后2^8 = 256,那将是价值RAM_DEPTH