[Verilog] +: 의 의미

YumeIroVillain·2021년 12월 17일
0

6.5학기

목록 보기
2/20
    genvar gi, gj;
    generate
        for (gi = 0; gi < INS_MEM_SIZE; gi = gi+1) begin : TMP_TO_MEM_1
            always @(negedge rstn) begin
                if (state) begin
                    ins_mem[gi*4+0] = ins_mem_tmp1[gi][0*BYTE_SIZE+:BYTE_SIZE];
                    ins_mem[gi*4+1] = ins_mem_tmp1[gi][1*BYTE_SIZE+:BYTE_SIZE];
                    ins_mem[gi*4+2] = ins_mem_tmp1[gi][2*BYTE_SIZE+:BYTE_SIZE];
                    ins_mem[gi*4+3] = ins_mem_tmp1[gi][3*BYTE_SIZE+:BYTE_SIZE];
                end
            end
        end
    endgenerate
    generate
        for (gi = 0; gi < 4; gi=gi+1) begin : ASSIGN_INSTRUCTION_
            assign instruction[gi*BYTE_SIZE+:BYTE_SIZE] = ins_mem[program_counter-INS_START+gi];
        end
    endgenerate

위 문법의 의미는 Vector bit-select and part-select addressing 이라는 것이다.
만약 아래 코드에서

logic [31: 0] a_vect;
logic [0 :31] b_vect;
logic [63: 0] dword;
integer sel;
a_vect[ 0 +: 8] // == a_vect[ 7 : 0]
a_vect[15 -: 8] // == a_vect[15 : 8]
b_vect[ 0 +: 8] // == b_vect[0 : 7]
b_vect[15 -: 8] // == b_vect[8 :15]
dword[8*sel +: 8] // variable part-select with fixed width

마지막줄의 동작은
sel이 0이면

dword[8*(0) +: 8] == dword[7:0]

sel이 7이면

dword[8*(7) +: 8] == dword[63:56]

가 된다.

좌측의 숫자는 starting index 를 가리키고, 우측의 숫자는 width를 가리키는데 +: 및 -: 가 지원된다.
예를 들어,

if(address[2*pointer+:2])

if({address[2*pointer+1],address[2*pointer]})

와 동치이다.

출처: What does "+:" mean in Verilog?

profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th

0개의 댓글