verilog에서 shift는 4가지 형태로 존재한다.
>>, << : unsiged 일 때 사용 (shift하고 비워진 bit는 0으로 채움)
>>>, <<< : signed 일 때 사용 (shift하고 비워진 bit는 sign bit으로 채움)
a = 5'b10100;
b = a <<< 2; //b == 5'b10000
c = a >>> 2; //c == 5'b11101, 'cause sign bit was `1`
d = a << 2; //d == 5'b10000
e = a >> 2; //e == 5'b00101
근데 이렇게 알고 a >>> 3을 했는데 sign bit으로 채워지지 않는 걸 발견했다.
보아 하니 a가 signed으로 casting 되어 있어야 했다.
reg signed [9:0] b = 10'sb11_0101_0101;
reg signed [9:0] a_signed;
reg [9:0] a_unsigned;
always_comb begin
a_signed = b >>> 2;
a_unsigned = b >> 2;
end
#a_signed 1111010101
#a_unsigned 0011010101
혹은
연산할 때 casting 방식으로
wire [PSUM_WL+SCALE_WL-1:0] bias_49bit = $signed({{(PSUM_WL+SCALE_WL-BIAS_WL+1){bias[BIAS_WL-1]}}, bias[BIAS_WL-2:0]}) >>> 3;
반응형
'Digital Logic > Verilog' 카테고리의 다른 글
[Verilog] Fixed point Scaler 연산 (Quantization - 비트 수가 다른 파라미터와 연산) (0) | 2023.09.06 |
---|---|
[Verilog] Fixed point Scaler 연산 (Quantization - sign 곱셈/덧셈 연산) (0) | 2023.09.06 |
[Verilog] Fixed point Scaler 연산 (Quantization - binary 연산) (0) | 2023.09.05 |
Verilog 설계에서 중요한 존재들 - Counter (카운터) (0) | 2021.05.10 |
Verilog 설계에서 중요한 존재들 - 순차 논리 회로(Sequential logic circuits)_#Flip-Flop (0) | 2021.05.09 |
댓글