7

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

parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;

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

4

3 回答 3

20

<<是二进制移位,将 1 向左移动 8 位。

4'b0001 << 1 => 4'b0010

>>是向 MSB 添加 0 的二进制右移。
>>>是一个有符号移位,如果左输入有符号,则保持 MSB 的值。

4'sb1011 >>  1 => 0101
4'sb1011 >>> 1 => 1101

表示左操作数有符号的三种方式:

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
于 2013-07-17T05:17:09.993 回答
6

1 << ADDR_WIDTH表示 1 将向左移动 8 位并将分配为 的值RAM_DEPTH

另外,1 << ADDR_WIDTH也表示2^ADDR_WIDTH。

给定ADDR_WIDTH = 8, then2^8 = 256和那将是RAM_DEPTH

于 2013-07-17T05:09:41.460 回答
3

<<是左移运算符,就像在许多其他语言中一样。

这里RAM_DEPTH1左移8 bits, 相当于2^8, 或256

于 2013-07-17T05:10:01.880 回答