Verilog에서 발생하는 ERROR:HDLCompiler:1401 에러에 대한 문제 상황, 원인 분석, 해결 방법에 대한 자세한 가이드입니다.
문제상황
예제 1
module counter(input clk, input rst, output reg [3:0] count);
always @(posedge clk or posedge rst) begin
if (rst) begin
count = 4'b0000;
end
else begin
count = count + 4'b0001;
end
end
endmodule
이 코드는 4비트 카운터를 구현한 예제입니다. 클럭(clk)이 상승 에지를 만나거나 리셋(rst) 신호가 입력되면 카운터가 동작하도록 되어 있습니다. 하지만 이 코드를 컴파일하면 다음과 같은 에러로그가 발생합니다.
에러로그 내용:
ERROR:HDLCompiler:1401 - "counter.v" line 5: Signal count in unit counter is connected to multiple drivers.
예제 2
module mux_2to1(input wire a, input wire b, input wire sel, output wire y);
reg temp;
always @(*) begin
if (sel) begin
temp = a;
end
else begin
temp = b;
end
end
assign y = temp;
endmodule
이 코드는 2:1 멀티플렉서를 구현한 예제입니다. sel 신호에 따라 입력 a 또는 b를 선택하고 출력 y에 전달하는 기능을 수행합니다. 하지만 이 코드를 컴파일하면 다음과 같은 에러로그가 발생합니다.
에러로그 내용:
ERROR:HDLCompiler:1401 - "mux_2to1.v" line 7: Signal temp in unit mux_2to1 is connected to multiple drivers.
원인분석
이 에러는 Signal count 또는 Signal temp가 multiple drivers에 연결되어 있어 발생한 것입니다. Verilog에서는 하나의 신호가 여러 개의 드라이버에 의해 제어되는 것을 허용하지 않습니다. 이 문제를 해결하기 위해서는 먼저 어떤 원리로 이러한 에러가 발생하는지 이해해야 합니다.
이해에 필요한 개념적인 부분의 설명:
Verilog에서는 always 블록 내부에서 non-blocking (<=) 또는 blocking (=) 대입문을 사용하여 변수의 값을 변경할 수 있습니다. 하지만 이들 대입문의 사용에는 주의가 필요합니다.
- Procedural Continuous Assignment : always 블록 내에서는 blocking 대입문을 사용하면 에러가 발생할 수 있습니다. 이는 blocking 대입문이 연속적으로 값을 변경하기 때문입니다.
- Non-Blocking vs Blocking : non-blocking 대입문은 대입문이 실행되는 순간 변수의 값을 변경하지 않고, 해당 시점 이후에 변경하도록 예약합니다. 반면, blocking 대입문은 대입문이 실행되는 즉시 변수의 값을 변경합니다. 따라서 non-blocking 대입문은 동시성을 유지하는데 도움이 됩니다.
에러 발생 원리를 각각 단계별로 설명:
- 예제 1에서는 always 블록 내에서 count 변수에 blocking 대입문을 사용하고 있습니다. 이로 인해 count 변수가 연속적으로 값을 변경하려고 시도합니다. rst와 clk의 상승 에지가 동시에 발생할 경우, count 변수는 두 개의 드라이버에 의해 제어되려고 합니다. 이로 인해 "Signal count in unit counter is connected to multiple drivers"라는 에러가 발생합니다.
- 예제 2에서는 always 블록 내에서 temp 변수에 blocking 대입문을 사용하고 있습니다. 이로 인해 temp 변수가 연속적으로 값을 변경하려고 시도합니다. sel 신호가 변경될 때마다 temp 변수는 두 개의 드라이버에 의해 제어되려고 합니다. 이로 인해 "Signal temp in unit mux_2to1 is connected to multiple drivers"라는 에러가 발생합니다.
해결방법-Non-Blocking 대입문 사용
예제 1 해결
에러가 수정된 코드:
module counter(input clk, input rst, output reg [3:0] count);
always @(posedge clk or posedge rst) begin
if (rst) begin
count <= 4'b0000;
end
else begin
count <= count + 4'b0001;
end
end
endmodule
- 위 코드에서는 count 변수에 non-blocking 대입문 (<=)을 사용하였습니다.
- 이제 rst와 clk의 상승 에지가 동시에 발생해도, count 변수는 동시성을 유지하면서 값을 변경할 수 있습니다.
- 이로 인해 "Signal count in unit counter is connected to multiple drivers" 에러가 해결됩니다.
예제 2 해결
에러가 수정된 코드:
module mux_2to1(input wire a, input wire b, input wire sel, output reg y);
always @(*) begin
if (sel) begin
y <= a;
end
else begin
y <= b;
end
end
endmodule
- 위 코드에서는 temp 변수를 제거하고, y 변수에 직접 non-blocking 대입문 (<=)을 사용하였습니다.
- 이제 sel 신호가 변경될 때마다 y 변수는 동시성을 유지하면서 값을 변경할 수 있습니다.
- 이로 인해 "Signal temp in unit mux_2to1 is connected to multiple drivers" 에러가 해결됩니다.
참고링크
728x90