我有一个正常的逆变器IV1(.in(a),. out(b))由受控逆变器IV0(.c(ctrl),...(d),... out(a))驱动。对于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不同 模拟。你真的需要使用always @ *来确保RTL和门 等级将匹配。
答案 0 :(得分:2)
指定弱逆变器:
not (weak1,weak0) u0 (out0,in1);
IV0(.c(ctrl), .in(d), .out(a)); //out is z when crtl==0
IV1( .in(a), .out(b));
IVW( .in(b), .out(a)); //out has weak drive
当ctrl为1时,我们才真正有这个:
IV1( .in(a), .out(b));
IVW( .in(b), .out(a));
这是一个定时循环,可能导致振荡器不稳定。