1

我有一个正常的反相器 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 和门级别匹配。


4

1 回答 1

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));

这是一个时序环路,可能会导致振荡器不稳定。

于 2013-09-23T22:06:04.747 回答