하지 시뮬레이션이 아닌 합성 코드에서 A
의 최종 값에 대한 결정적 아무것도 없다.
그러나 정확히 말하면 디자인에 A
에 트리거가있는 경우 시뮬레이션 합성 불일치가 발생할 수 있습니다. 그래서 a
항상 끝, 시뮬레이션 동안
module tb;
reg clk = 0;
always #5 clk = ~clk;
wire a, b;
test uut (clk, a, b);
initial begin
$monitor("clk=%b a=%b b=%b", clk, a, b);
repeat (100) @(posedge clk);
$finish;
end
endmodule
업데이트 a <= 0
및 a <= 1
모두 NBA 이벤트 영역으로 밀어 넣으면에서 주문 실행됩니다
module test(input clk, output reg a, b);
always @(posedge clk) begin
a <= 0;
a <= 1;
end
initial b = 0;
always @(posedge a) begin
b <= !b;
end
endmodule
그리고 테스트 벤치 : 다음 예를 살펴 보겠습니다 되고있다. 그러나 a <= 0
도 실행되므로 매 클록주기마다 너비가 0 인 네거티브 펄스가 a
에 있습니다. 이 펄스는 두 번째 항상 블록을 트리거합니다.
clk=0 a=x b=0
clk=1 a=1 b=1
clk=0 a=1 b=1
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=1
clk=0 a=1 b=1
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=1
clk=0 a=1 b=1
clk=1 a=1 b=0
clk=0 a=1 b=0
...
그러나, 합성이 간단히 a
에게 일정한 값 1 b
상수 제로 값을 지정한다 :이 (루스의 Verilog와 ModelSim을 테스트) 시뮬레이션 출력된다. (Yosys와 Xilinx Vivado로 테스트되었습니다.) 그래서 포스트 합성 시뮬레이션 출력은 다음과 같습니다
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
clk=0 a=1 b=0
clk=1 a=1 b=0
(이론적으로 첫 번째 줄은 여전히 a=x
말할 수 있지만, 모든 괜찮은 합성 툴은 테스트에서 모두 도구로, 멀리 a
-flip 플롭을 최적화 할 것 않았다.)
그 외에도 그 코드에는 문제가 없으며 그의 답변에서 @Morgan이 정확하게 지적했듯이 이것은 인코딩하기 전에 출력 신호의 "기본값"을 정의하는 매우 일반적인 코딩 기술입니다. 조건부 지정을 사용하는 특별한 경우 (if
및/또는 case
사용).
유효하지 않은 구문입니다. 좀 더 완전한 코드 예제를 보여줘야합니다. – toolic