시뮬레이션이 시작되기 전에 디자인을 구체화 할 때 generate 블록을 표준 verilog 모듈 항목으로 확인해야합니다. 귀하의 예에서 도구는 상수로 if (j==0)
을 평가하려고 시도 할 수 없습니다.
예를 들어 무엇을 하려는지 명확하지 않습니다. 여기에 날 위해 일하는 몇 예 : 버스의 비트 이상
wire [9:0] w;
genvar i;
generate
for(i=0; (i<10); i=i+1) begin: gen_columns
if (i==0) begin
assign w[i] = 1'b0;
end else begin
assign w[i] = 1'b1;
end
end
endgenerate
initial begin
$display ("%x", w);
$finish;
end
이 코드 반복은, 비트에 따라 다른 값을 할당합니다. 출력은 3fe
입니다.
reg clk;
integer j [0:1];
genvar i;
generate
for(i=0; (i<2); i=i+1) begin: gen_columns
always @(posedge clk) begin
if (j[i]==0) begin
j[i] <= j[i] + 1;
end
end
end
endgenerate
initial clk = 1'b0;
always #1 clk = ~clk;
initial begin
$monitor ("%d: j[0]: %d, j[1]: %d", $time, j[0], j[1]);
repeat (2) @(posedge clk);
j[0] = 0;
j[1] = 0;
repeat (2) @(posedge clk);
$finish;
end
이 코드는 제로를하는 경우를 증가시키는 j[0]
및 j[1]
에 대한 동일한 로직을 생성합니다. 출력은 다음과 같습니다.
0: j[0]: x, j[1]: x
3: j[0]: 0, j[1]: 0
5: j[0]: 1, j[1]: 1
두 번째 사례와 예가 다른 점은 if 문과 할당이 항상 블록 내에 있다는 것입니다. 설계가 정교 해지면 도구는 생성 블록을 두 개의 항상 블록으로 바꿉니다. 하나는 i=0
이고 다른 하나는 i=1
입니다.
스타일 참고 : 여러 개의 항상 블록에서 변수를 업데이트하는 것이 유효한 verilog이지만 좋은 연습으로 간주되지 않습니다. 다중 신호로 합성 될 가능성이 높고 시뮬레이션에서 경쟁 조건을 도입 할 수 있습니다. 두 번째 예에서 할당이 j = j + 1
([i]
없이) 인 경우 j
이 여러 개의 항상 블록에 할당됩니다.