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]})
와 동치이다.