次のような行がある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
左のオペランドが符号付きであることを示す3つの方法:
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
の場合、2^8 = 256
を指定すると、それがRAM_DEPTH
の値になります
<<
は、他の多くの言語と同様に、左シフト演算子です。
ここでRAM_DEPTH
は1
によって8 bits
に左シフトされます。これは2^8
または256
と同等です。