【问题标题】:Verilog execution orderVerilog 执行顺序
【发布时间】:2012-04-01 02:41:31
【问题描述】:

在学习了 VHDL 课程后,我才刚刚开始自学 Verilog。我无法理解行为语句的执行顺序。这是有问题的代码。

//This files is an experiment into the order in which verilog executes it's statements

module MainCircuit(clk, start);

    parameter cycles = 8;
    input clk;
    input start;
    //input [15:0] data;

    integer i;

    always @(posedge clk)
    begin
        if(start)
        begin
            i=0;

            repeat(cycles)
            begin
                @(posedge clk) $display("%d\ti = %d", $time, i);
                i = i + 1;
            end
        end
    end

endmodule

module tester;

    reg clk;
    wire start;

    assign start = 1'b1;
    initial clk = 1'b0;

    MainCircuit myMain(clk, start);
    initial repeat(40)
    begin
        #5 clk = 1'b1;
        #5 clk = 1'b0;
    end

endmodule

这是输出

                  15    i =           0
                  25    i =           1
                  35    i =           2
                  45    i =           3
                  55    i =           4
                  65    i =           5
                  75    i =           6
                  85    i =           7
                 105    i =           0
                 115    i =           1
                 125    i =           2
                 135    i =           3
                 145    i =           4
                 155    i =           5
                 165    i =           6
                 175    i =           7
                 195    i =           0
                 205    i =           1
                 215    i =           2
                 225    i =           3
                 235    i =           4
                 245    i =           5
                 255    i =           6
                 265    i =           7
                 285    i =           0
                 295    i =           1
                 305    i =           2
                 315    i =           3
                 325    i =           4
                 335    i =           5
                 345    i =           6
                 355    i =           7
                 375    i =           0
                 385    i =           1
                 395    i =           2

我不明白为什么我没有在每个正时钟沿重置为零。 myMain 是否记得它在哪里执行并在每次调用时钟时从那里继续?如果是这样,它停在哪里? 而这一切又将如何合成?

另外两个小问题:

我试着写 开始

第二个是输出中奇怪的间距是什么?

感谢您的宝贵时间。

【问题讨论】:

    标签: verilog hdl


    【解决方案1】:
    1. always @(posedge clk) 不会在每个时钟沿自动执行。 always 块只能在其当前执行结束后重新启动(您不能同时让两个线程执行一个块)。你的 always 块直到 8 个时钟后才会到达end,因为它卡在你的(重复周期)循环中。只有在 8 个 posedge 时钟之后,它才能完成循环,到达 always 块的末尾,然后在下一个 posedge 重新开始。

    2. start <= 1'b1是非阻塞赋值,只能在always块内执行。

    3. $display 可能保留了足够的空间来打印 32 位小数的最大值。如果您不想要所有额外的空格,请尝试使用 %0d 而不是 %d

    【讨论】:

    • 谢谢,这是我第一次在这里发帖,我担心verilog部分不会很活跃。 1) 那么执行是否挂在@(posedge clk) $display("%d\ti = %d", $time, i);?另外,这如何合成为逻辑? 2)哪种方式是将输入硬接线到电路的标准方式?我认为 assign 和 always 都是过程代码块,但我认为硬连线更像是门级的东西。
    • @ChrisMorin 它可能不如大多数部分活跃,但大多数问题看起来至少得到一两个答案。是的,执行确实在显示行暂停。 @(posedge clk) 只是意味着“在这里等到时钟的上升沿,然后运行下一条语句”。我不确定如何回答“这是如何合成的”......我想它只会创建一个运行高达 8 位然后重复的计数器,类似于您的输出。至于如何硬连线输入,将 DUT 上的端口设置为常数值的 assign 语句没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2018-08-12
    相关资源
    最近更新 更多