如何用verilog中的常量初始化导线?

时间:2016-04-03 09:58:21

标签: verilog modelsim

在下面提到的J-K Flip Flop的verilog代码中,我想用一些值初始化线型q和q_bar。例如:我在这里初始化q和q_bar为0.但是在输出中,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 

1 个答案:

答案 0 :(得分:1)

有几个问题需要解决。

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

具有交叉NAND门的设计将在硬件实现中在启动时产生稳定值,即使最初未定义导线1'bX。您可以在电路中使用1'X转换1'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