制御されたインバーター IV0(.c(ctrl),.in(d),.out(a)) によって駆動される通常のインバーター IV1(.in(a), .out(b)) があります。IV0 の場合、ctrl が 1 の場合、出力がドライブされます。それ以外の場合は、フローティングのままになります。
その間、弱いフィードバック インバーター IVW(.in(b), .out(a)) があります。
ctrl が 1 の場合、ノード a の値は IV0 によって駆動されます。ctrl が 0 の場合、ノード a は弱いフィードバック インバーターによって駆動されます。
IV0 がノード a を駆動するとき、弱フィードバック インバータ IVW もノード a を駆動します。ノード a を異なる値に駆動すると、verilog は X を生成します。
これをVerilogで書くにはどうすればよいですか?
元の答え
module buf(input d,ctrl, output b);
reg a,b;
always @ (d or ctrl) begin
if(ctrl==1) begin
a=~d;
b=~a;
end
else begin
a=~b;
b=~a;
end
end
endmodule
モーガンのコメント
これは、合成後に現在の RTL シミュレーションと同じようには機能しません。RTL とゲート レベルが確実に一致するようにするには、常に @* を使用する必要があります。