예컨대verilog의generate
genvar i;
generate
for(i=0;i<32;i=i+1) begin:down_wreq_gen
always @(posedge up_clk )down_wreq[i]<=(up_waddr[13:9]==i)&&(up_wreq==1);
end
endgenerate
이것은 사실 스크립트 언어와 유사한 묘사 방법으로 32번 순환해서 전개하는 것이다.우리는 C 언어로 작은 코드를 써서 이 부분을 펼칠 수 있다.
void main (void){
int i ;
for(i=0;i<32;i=i+1) // begin:down_wreq_gen
printf("always @(posedge up_clk )down_wreq[%-2d]<=(up_waddr[13:9]==%-2d)&&(up_wreq==1);
",i,i);
//end
}
위의 프로그램 구간에서 분명히 보듯이 사실은generate 문장을 c 언어로 다시 한 번 설명하는 것이다.
C 언어가 실행된 후 인쇄된 결과는 다음과 같습니다.
always @(posedge up_clk )down_wreq[0 ]<=(up_waddr[13:9]==0 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[1 ]<=(up_waddr[13:9]==1 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[2 ]<=(up_waddr[13:9]==2 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[3 ]<=(up_waddr[13:9]==3 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[4 ]<=(up_waddr[13:9]==4 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[5 ]<=(up_waddr[13:9]==5 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[6 ]<=(up_waddr[13:9]==6 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[7 ]<=(up_waddr[13:9]==7 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[8 ]<=(up_waddr[13:9]==8 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[9 ]<=(up_waddr[13:9]==9 )&&(up_wreq==1);
always @(posedge up_clk )down_wreq[10]<=(up_waddr[13:9]==10)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[11]<=(up_waddr[13:9]==11)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[12]<=(up_waddr[13:9]==12)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[13]<=(up_waddr[13:9]==13)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[14]<=(up_waddr[13:9]==14)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[15]<=(up_waddr[13:9]==15)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[16]<=(up_waddr[13:9]==16)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[17]<=(up_waddr[13:9]==17)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[18]<=(up_waddr[13:9]==18)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[19]<=(up_waddr[13:9]==19)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[20]<=(up_waddr[13:9]==20)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[21]<=(up_waddr[13:9]==21)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[22]<=(up_waddr[13:9]==22)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[23]<=(up_waddr[13:9]==23)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[24]<=(up_waddr[13:9]==24)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[25]<=(up_waddr[13:9]==25)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[26]<=(up_waddr[13:9]==26)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[27]<=(up_waddr[13:9]==27)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[28]<=(up_waddr[13:9]==28)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[29]<=(up_waddr[13:9]==29)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[30]<=(up_waddr[13:9]==30)&&(up_wreq==1);
always @(posedge up_clk )down_wreq[31]<=(up_waddr[13:9]==31)&&(up_wreq==1);
이 한 무더기의 코드는 상술한generate가 기술한 내용에 대응한다.이 코드들은 이전의generate 설명을 완전히 대체할 수 있다.
이것을 통해 generate가 스크립트 언어로서 순환 나열 기능을 실현하는 것을 형상적으로 이해할 수 있지 않을까요?
또 하나의 중요한 기능은 조건 컴파일링이다. 예처리 문장인ifdef와 유사하다.이 방면의 예는 매우 많으니, 많이 말하지 마라.