반응형
RTL 설계하다보면 동일 block을 여러번 instance 할 경우가 생깁니다
이때 1~2개만 추가하는거면 모르겠지만 수십개를 추가하기에는 너무 효율이 좋지않아
gererate라는 keyword를 사용하여 설계를 한다고 합니다(저도 최근 공부하면서 알게됬네요)
참고한 사이트는 아래와 같습니다
www.chipverify.com/verilog/verilog-generate-block
여기에 작성되어 있는 걸 그대로 한번 simulation을 해보겠습니다
module test_main();
parameter N = 2;
reg [N-1:0] a,b;
wire [N-1:0] sum, cout;
my_design #(.N(N)) md( .a(a),.b(b),.sum(sum),.cout(cout));
initial begin
a <= 0;
b<= 0;
$monitor("a=0x%h b=0x%h sum=0x%h cout=0x%h", a, b, sum, cout);
#10 a <= 'h2; b <= 'h3;
#20 b <= 'h4;
#10 a <= 'h5;
end
endmodule
module ha( input a,b, output sum, cout);
assign sum = a^b;
assign cout = a&b;
endmodule
module my_design
#(parameter N=4)(input [N-1:0] a,b, output [N-1:0] sum,cout);
generate
for(genvar i=0;i<N;i=i+1)begin
ha u0(.a(a[i]),.b(b[i]),.sum(sum[i]),.cout(cout[i]));
end
endgenerate
endmodule
여기서 보면 for 문 안에 쓰이는 변수는 genvar라는 keyword를 통해 선언해 주어야 합니다.
해당 keyword는 verilog-2000에서 새로 추가된 keyword이며, 양의 정수만 저장이 가능합니다
위와 같이 나오는데
2bit 짜리 adder를 상위비트와 하위비트로 나누어서 반가산기 2개를 적용한 것이라고 볼수 있습니다
결과가 좀 이상해보이는 건 현재 선언된 비트가 2bit 이기 때문입니다
해당 블로그를 좀 더 보면 generate 에는 if else 도 적용이 된다고 합니다
대신에 저기 사용된 USE case는 신호가 아니라 parameter등으로 미리 선언된 상수 여야 합니다
마찬가지로 case도 될 수 있다고 하니 참고하시기 바랍니다
이게 합성까지 되는지는 저도 아직 확인을 못했습니다
'language > Verilog' 카테고리의 다른 글
[systemverilog] enum 사용법 (0) | 2021.02.02 |
---|---|
[verilog] >>, >>>, <<, <<< 연산자 (2) | 2021.01.31 |
[systemverilog] automatic keyword (0) | 2021.01.31 |
[systemverilog] task 와 function (0) | 2021.01.31 |
[verilog] $signed casting logic count (0) | 2021.01.26 |
댓글