我有一个verilog代码,其中有一行如下:
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
这里将存储RAM_DEPTH
什么以及<<
操作员在这里做什么。
我有一个verilog代码,其中有一行如下:
parameter ADDR_WIDTH = 8 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
这里将存储RAM_DEPTH
什么以及<<
操作员在这里做什么。
<<
是二进制移位,将 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
1 << ADDR_WIDTH
表示 1 将向左移动 8 位并将分配为 的值RAM_DEPTH
。
另外,1 << ADDR_WIDTH
也表示2^ADDR_WIDTH。
给定ADDR_WIDTH = 8
, then2^8 = 256
和那将是RAM_DEPTH
<<
是左移运算符,就像在许多其他语言中一样。
这里RAM_DEPTH
将1
左移8 bits
, 相当于2^8
, 或256
。