我有一个正常的反相器 IV1(.in(a),.out(b)),由受控反相器 IV0(.c(ctrl),.in(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 和门级别匹配。