언어/Verilog 코드 예제

[Verilog] >>, <<, >>>, <<< 연산자 시뮬레이션 결과

lunar7604 2022. 9. 28. 16:13

Revision history:

220928 최초 작성

 

 


 

Verilog에서 >>, << 연산자와 <<<, >>> 연산자가 있다.

계산 예를 보고 차이점을 직관적으로 알 수 있다.

 

 

Vivado2020.2 Xsim 코드 및 결과

 

wire signed [3:0] w_val = 4'b1011              ; // Signed로 명시 필요

wire [3:0] w_val_0                  ;
wire [3:0] w_val_1                  ;
wire [3:0] w_val_2                  ;
wire [3:0] w_val_3                  ;
wire [3:0] w_val_4                  ;
wire [3:0] w_val_5                  ;
wire [3:0] w_val_6                  ;
wire [3:0] w_val_7                  ;

 

// >> 연산자 사용
assign w_val_0 = w_val >> 0               ;
assign w_val_1 = w_val >> 1                ;
assign w_val_2 = w_val >> 2                ;
assign w_val_3 = w_val >> 3                ;

 

// >>> 연산자 사용
assign w_val_4 = w_val >>> 0               ;
assign w_val_5 = w_val >>> 1               ;
assign w_val_6 = w_val >>> 2               ;
assign w_val_7 = w_val >>> 3               ;

 

w_val에 '>>' 연산자를 사용하면 MSB에 0이 채워지고

w_val에 '>>>' 연산자를 사용하면 MSB에 Singed bit로 채워진다.

 

 

 


그외 시뮬레이션 

wire signed [3:0] w_val = 4'b0011              ;

wire [3:0] w_val_0                  ;
wire [3:0] w_val_1                  ;
wire [3:0] w_val_2                  ;
wire [3:0] w_val_3                  ;
wire [3:0] w_val_4                  ;
wire [3:0] w_val_5                  ;
wire [3:0] w_val_6                  ;
wire [3:0] w_val_7                  ;


assign w_val_0 = w_val >> 0               ;
assign w_val_1 = w_val >> 1                ;
assign w_val_2 = w_val >> 2                ;
assign w_val_3 = w_val >> 3                ;
assign w_val_4 = w_val >>> 0               ;
assign w_val_5 = w_val >>> 1               ;
assign w_val_6 = w_val >>> 2               ;
assign w_val_7 = w_val >>> 3               ;

 

 

wire [3:0] w_val = 4'b1011              ;

wire [3:0] w_val_0                  ;
wire [3:0] w_val_1                  ;
wire [3:0] w_val_2                  ;
wire [3:0] w_val_3                  ;
wire [3:0] w_val_4                  ;
wire [3:0] w_val_5                  ;
wire [3:0] w_val_6                  ;
wire [3:0] w_val_7                  ;


assign w_val_0 = w_val >> 0               ;
assign w_val_1 = w_val >> 1                ;
assign w_val_2 = w_val >> 2                ;
assign w_val_3 = w_val >> 3                ;
assign w_val_4 = w_val >>> 0               ;
assign w_val_5 = w_val >>> 1               ;
assign w_val_6 = w_val >>> 2               ;
assign w_val_7 = w_val >>> 3               ;

 

 

wire signed [3:0] w_val = 4'b1011              ;

wire [3:0] w_val_0                  ;
wire [3:0] w_val_1                  ;
wire [3:0] w_val_2                  ;
wire [3:0] w_val_3                  ;
wire [3:0] w_val_4                  ;
wire [3:0] w_val_5                  ;
wire [3:0] w_val_6                  ;
wire [3:0] w_val_7                  ;


assign w_val_0 = w_val << 0               ;
assign w_val_1 = w_val << 1                ;
assign w_val_2 = w_val << 2                ;
assign w_val_3 = w_val << 3                ;
assign w_val_4 = w_val <<< 0               ;
assign w_val_5 = w_val <<< 1               ;
assign w_val_6 = w_val <<< 2               ;
assign w_val_7 = w_val <<< 3               ;