如何在 verilog 中用常量初始化电线?

How to initialize a wire with constant in verilog ?

在下面提到的 J-K Flip Flop 的 verilog 代码中,我想用一些值初始化线类型 q 和 q_bar。例如:我在这里用 0 初始化 q 和 q_bar。但是在输出中,q 和 q_bar 不关心 (1'hx) 值。那么如何用常量初始化线类型呢?

module JK_FF(j,k,clk,q,q_bar) ;
input j,k,clk ;
output q , q_bar  ;
wire s,r,w,z ;

assign w = q ;
assign z = q_bar ;

nand U1(s,j,clk,z) ;
nand U2(r,k,clk,w) ;
nand U3(q,s,z) ;
nand U4(q_bar,r,w) ;

endmodule

/*  TEST BENCH  */

module JK_FF_TB ;

reg j,k,clk ;
wire q , q_bar ;

assign q = 1'b0 ;
assign q_bar = 1'b0 ;

initial begin
clk = 1'b1 ;
end 

JK_FF DUT(j,k,clk,q,q_bar) ;

 initial
 begin
 j = 1'b0 ;
 k = 1'b0 ;

 #5

  j = 1'b0 ;
  k = 1'b1 ;

  #5

  j = 1'b1 ;
  k = 1'b0 ;

  #5

  j = 1'b1 ;
  k = 1'b1 ;

  end
  endmodule 

有几个问题需要解决。

Verilog中的状态,如触发器的值,通常保存在reg类型中,其中的值可以使用initial初始化。然而,在简单的由门组成的触发器中,只有电线,无法初始化。

具有交叉 NAND 门的设计将在硬件实现中导致启动时的稳定值,即使最初未定义连线也是如此 1'bX。您可以在电路中使用从 1'X1'b01'b1 的转换在 qq_bar 处使用 assign as:

来模拟这一点
assign w = q !== 1'b0;  // 1'bX => 1
assign z = q_bar === 1'b1;  // 1'bX => 0

然而,Verilog 实现会产生竞争条件,因为时钟脉冲对于模拟此设计时发生的即时变化来说总是太长。这通常显示为模拟期间的无限迭代,从而达到迭代极限并产生错误。

因此需要进行更多修改,您可以在这里找到很棒的教程:The JK Flip Flop