首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟在verilog中的DFF

延迟在verilog中的DFF
EN

Stack Overflow用户
提问于 2015-08-17 09:33:53
回答 1查看 2.3K关注 0票数 0

我正试图在verilog中实现nand2tetris项目,并且正在使用伊卡洛斯来解决问题。在书中,他们实现了这样的DFF,q(t) = d(t-1)。当前时间的输出是上一个posedge clk的输入。这是我意识到的DFF

代码语言:javascript
复制
module Dff (
    output reg q,
    input data, clk
);

    reg p;
    reg o;

    always @(posedge clk) begin
        o <= data;
        q <= p;
    end

    always @(negedge clk) begin
        p <= o;
    end

endmodule

当我直接测试这个DFF时,它似乎工作得很好。但是当我重用它来创建一个内存单元时,它会变得疯狂。有趣的是,使用Icarus或EDAPlayground (使用VCS)的疯狂是不同的。

代码语言:javascript
复制
module Mux (out, a, b, sel);
    input a, b;
    input sel;
    output reg out;

    assign out = ~sel ? a : b;
endmodule

module Bit (
    output out,
    input data, load, clk
);

    Mux m0(in, out, data, load);
    Dff d0(out, in, clk);
endmodule

Icarus Verilog输出

代码语言:javascript
复制
 data | load | clk | out
------+------+-----+-----
    0 |    1 |   1 |   x
    0 |    1 |   0 |   x
    1 |    1 |   1 |   x
    1 |    1 |   0 |   x
    0 |    1 |   1 |   1
    0 |    1 |   0 |   1
    0 |    0 |   1 |   0
    0 |    0 |   0 |   0
    1 |    1 |   1 |   0
    1 |    1 |   0 |   0
    0 |    0 |   1 |   0   # !?!?!
    0 |    0 |   0 |   0   # it should be 1 here.

EDAPlayground输出

代码语言:javascript
复制
 data | load | clk | out
------+------+-----+-----
    0 |    1 |   1 |   x
    0 |    1 |   0 |   x
    1 |    1 |   1 |   x
    1 |    1 |   0 |   x
    0 |    1 |   1 |   1
    0 |    1 |   0 |   1
    0 |    0 |   1 |   0
    0 |    0 |   0 |   0
    1 |    1 |   1 |   1  # !?!?!
    1 |    1 |   0 |   1  # it should be 0 here.
    0 |    0 |   1 |   1
    0 |    0 |   0 |   1

该代码在EDAPlayground上是可测试的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 10:54:28

感谢Uun和Greg,我是如何解决这个问题的。The 密码在EDA操场上

一个DFF可以更简单。

代码语言:javascript
复制
module Dff (
    output reg q,
    input data, clk
);
    always @(posedge clk) begin
        q <= data;
    end
endmodule

那么测试就是罪魁祸首。阻塞作业会造成混乱。修复这一问题的一个简单方法是通过<=更改所有<=,如下所示:

代码语言:javascript
复制
module Bit_tb;
    reg clk = 0;
    reg data = 0;
    reg load = 1;
    wire out;

    initial begin
        #2
        data <= 1;

        #2
        load <= 0;  // load = 0; /!\ would be blocking before
        data <= 0;  // data = 0; doing this line. /!\

        #2
        $finish;
    end
endmodule
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32047033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档