Verilog执行顺序

Verilog执行顺序,verilog,hdl,Verilog,Hdl,在上了一门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]

在上了一门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是否记得它在执行中的位置,并在每次调用时钟时从那里继续?如果是,停在哪里? 这一切又是如何合成的呢

另外两个小问题:

我试着写作 开始
  • always@(posedge clk)
    不会在每个时钟边缘自动执行。always块只能在其当前执行结束后重新启动(不能同时有两个线程执行一个块)。您的always块在8个时钟之后才会到达
    结束
    ,因为它卡在您的(重复周期)循环中。只有在8个posedge时钟之后,它才能完成循环,到达always块的末尾,然后在下一个posedge上重新启动


  • 开始谢谢,这是我第一次在这里发帖,我担心verilog部分不会很活跃。1) 执行在
    @(posedge clk)$display(“%d\ti=%d”,$time,i)处也会挂起?还有,这是如何综合到逻辑的?2) 哪种方式是将输入硬接线到电路的标准方式?我认为赋值和总是程序代码块,但我认为硬接线更像是门级的事情。@ChrisMorin它可能没有大多数部分活跃,但大多数问题看起来至少有一个或两个答案。是,执行会在显示行上暂停@(posedge clk)的意思是“在这里等到时钟的正边缘,然后运行下一条语句”。我不知道该如何回答“这是如何合成的”。。。我猜它只会创建一个计数器,运行高达8位,然后重复,类似于您的输出。至于如何硬连接输入,assign语句将DUT上的端口设置为常量值没有错。