플립플롭이 포함된 순차회로에서 blocking할당문과 nonblocking할당문의 차이를 명확하게 이해하기 위해 다음의 Verilog modeling을 생각해본다. 두 코드는 blocking할당문 4개가 사용되었으며, 서로의 순서가 뒤바뀌어 있다. 이들 두코드는 다음과 같이 합성되며, 서로 다른 회로로 동작한다.
순차회로 모델링에 blocking할당문이 사용되면 always블록 내부에서 할당문의 나열 순서에 따라 회로의 동작이 달라진다는 사실을 알 수 있으며, 따라서 사용에 주의해야 한다.
다음은 4개의 nonblocking 할당문이 사용되고 있으며, 순서가 뒤바뀌어 있다. 이들 두 코드는 동일한 회로로 합성되어 동일한 회로로 동작한다. nonblocking할당문이 사용되면 always블록 내부에서 할당문의 나열 순서에 무관하게 동일한 회로로 동작함을 알 수 있다.
위의 코드는 4비트 시프트 레지스터로 동작하는 반면에, 앞의 코드는 1비트 레지스터로 동작한다. 만약 4비트 시프트 레지스터의 모델링을 위해 blocking할당문을 사용했다면, 전혀 다른 회로로 동작하게 될 것이다.
Verilog modeling에 있어서 이와 같은 혼동과 실수를 방지하기 위해서는 다음과 같은 코딩 가이드라인을 따르는 것이 바람직한다.
1. 순차회로 또는 래치를 모델링하는 always블록에서는 nonblocking할당문을 사용한다.
2. 조합논리회로를 모델링하는 always블록에서는 blocking 할당문을 사용한다.
3. 동일한 always블록에서 순차회로와 조합논리회로를 함께 표현하는 경우에는 nonblocking 할당문을 사용한다.
4. 동일한 always블록 내에서 blocking 할당문과 nonblocking할당문을 혼합해서 사용하지 않는다.
다음과 같이 always블록 내에 blocking할당문과 nonblocking할당문이 함께 사용되어도 회로는 올바르게 동작할 수 있지만, 설계자가 시뮬레티어틔 event 스케쥴 방식을 잘못 이해하고 있는 경우에 잘못된 코딩에 의해 혼동과 실수를 초래할 수 있으므로 이와 같은 코딩 방식은 사용하지 않는 것이 좋다.
module ba_nab2(q,a,b,clk,rst_n);
output reg q;
input a,b,clk,rst_n;
reg tmp;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q <= 1'b0;
else begin
tmp = a&b;
q <= tmp;
end
end
endmodule
바람직하지 않은 코딩 방식 1
module ba_nab3(q,a,b,clk,rst_n);
output reg q;
input a,b,clk,rst_n;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q <= 1'b0;
else q <= a&b;
end
endmodule
바람직한 코딩 방식 1
module ba_nba1(q,a,b,clk,rst_n);
output reg q;
input a,b,clk;
reg tmp;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q =1'b0; // blocking
else begin
tmp = a&b; // blocking
q <= tmp; // nonblocking
end
end
endmodule
바람직하지 않은 코딩 방식 2
module ba_nab4(q,a,b,clk,rst_n);
output reg q;
input a,b,clk;
wire tmp;
assign tmp = a&b;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q <= 1'b0;
else q <= tmp;
end
endmodule
바람직한 코딩 방식 2
5. 다수의 always블록에서 동일한 reg 변수에 값을 할당하지 않는다.
아래와 같이 서로 다른 always블록에서 동일한 reg 객체에 값을 할당하면 다중구동(multiple driving)이 되어 합성 이전의 시뮬레이션 결과와 합성 이후의 시뮬레이션 결과가 달라질 수 있으므로, 이와 같은 코딩방식은 사용하지 않는다.
module badcode1(q,d1,d2,clk,rst_n);
output reg q;
input q,d1,d2,clk,rst_n;
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q <= 1'b0;
else q <= d1;
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n) q <= 1'b0;
else q <= d2;
end
endmodule
다중구동이 발생하는 코딩 방식
'UVM & RTL > Verilog HDL' 카테고리의 다른 글
[28] Verilog HDL 순차회로 (시프트 레지스터) (0) | 2022.03.05 |
---|---|
[27] Verilog HDL blocking할당문과 nonblocking할당문 설계과제 (2) | 2022.03.05 |
[25] Verilog HDL 순차회로 설계과제 (LATCH, FILP FLOP) (0) | 2022.03.05 |
[24] Verilog HDL 순차회로 (LATCH, FILP FLOP) (0) | 2022.03.05 |
[23] Verilog HDL 순차회로 설계과제 (COMPARATOR, TRI-STATE) (0) | 2022.03.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!