Verilog:使用数据流模型的T触发器

时间:2018-04-04 12:22:06

标签: verilog flip-flop

我试图模拟t-flipflop的工作。

`timescale 1ns / 1ps
module t_flipflop(
input t,
input clk,
input clear,
output q,
output qbar
);

 wire sbar, rbar;


 assign sbar= ~(t & clk & qbar & clear);
 assign rbar= ~(t & clk & q);

 assign q= ~(sbar & qbar);
 assign  qbar= ~(rbar & q & clear);
endmodule

现在输出时q的值在t = 1时切换,但qbar的值始终为1

当t = 1时,q始终为0且qbar为1。

我做错了什么?

测试夹具 -

`timescale 1ns / 1ps
module test_t_flipflop;

// Inputs
reg t;
reg clk;
reg clear;

// Outputs
wire q;
wire qbar;

// Instantiate the Unit Under Test (UUT)
t_flipflop uut (
    .t(t), 
    .clk(clk), 
    .clear(clear), 
    .q(q), 
    .qbar(qbar)
);



initial begin


    clear=1'b0;
    #34 clear=1'b1;


end

initial begin

    t=1'b0;
    clk=1'b0;
    forever #15 clk=~clk;
end



initial begin

    #10 t=1;
    #95 t=0;
    #40 t=1;
end 

output signals

编辑:添加了完整的测试夹具代码。

我想用数据流模型实现这一点,以便清楚地理解它

1 个答案:

答案 0 :(得分:1)

您正尝试使用连续分配对顺序逻辑进行建模。这可能导致不可预测的模拟结果。例如,当我使用Incisive运行代码时,会导致无限循环,这通常表示竞争条件。我假设比赛是由于反馈路径:q取决于qbarq依赖于module t_flipflop ( input t, input clk, input clear, output reg q, output qbar ); assign qbar = ~q; always @(posedge clk or negedge clear) begin if (!clear) begin q <= 0; end else if (t) begin q <= ~q; end end endmodule

建模顺序逻辑的正确方法是使用这种寄存器传输逻辑(RTL)编码风格:

php71

这消除了反馈路径,并通过消除内部线路简化了代码。它也可以用于合成。