私は次のような行がある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
左オペランドが署名されていることを示す 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