【问题标题】:Error while using always block in verilog在verilog中使用总是块时出错
【发布时间】:2015-11-15 11:17:58
【问题描述】:

我在verilog中有一个模块temp1,如下所示,-

module temp1;
---
---
---
endmodule

我想从其他模块temp2 调用这个模块实例。但是,我想在时钟的正边缘遵循这个法则-

module temp2(clk);
    input clk;
    always @(posedge clk)
        temp1 t1;
endmodule

这给了我语法错误。看来我不应该从 always 块中调用任何模块。我们不能从always 块中创建模块的实例是真的吗?如果是,我该如何以其他方式执行此操作,因为我必须在时钟的位置调用 temp1?

【问题讨论】:

    标签: verilog


    【解决方案1】:

    在verilog中,当您实例化一个模块时,这意味着您正在向开发板添加额外的硬件

    此硬件必须添加在模拟开始之前(即在编译时)。在这里,您可以在每个时钟脉冲处添加/删除硬件。

    一旦实例化,模块就会执行/检查模拟的每个时间戳,直到结束。

    所以要执行任何模块,只需实例化它,为其提供 clk 和其他所需的输入,然后在子模块本身中添加 always 块

    module temp2(clk);
        input clk;
            temp1 t1(clk); // note the input port clk here
    endmodule
    
    module temp(input clk);
        always @(posedge clk)
        begin
        // ...
        end
    endmodule
    

    Verilog 提供了一个 generate 块来创建同一模块的多个实例

    genvar i;  // note special genvar type, used in generate block
    generate
    for(i=0;i<5;i++)
    temp t1[i];  // create 5 instances of temp module
    endgenerate
    

    旁注:

    您可能对模块实例化任务/函数的调用有混淆。模块是静态实体,而任务/功能可以是动态。正如你所展示的,如果 temp 是一个task,那么上面的调用是有效的。

    task temp;
    // ...
    endtask: temp
    
    module temp2(clk);
        input clk;
        always @(posedge clk)
            temp1(); // task/function temp
    endmodule
    

    关于实例化的更多信息可以从Verilog Module InstantiationInstantiating Modules and PrimitivesStructural Modelling链接获得。

    【讨论】:

    • 谢谢,但如果我必须只在时钟的第一个上升沿调用模块,然后我不想调用它。在那种情况下,我该怎么做?因为在初始块中调用模块将不起作用。而且我不想在我的模块中输入初始值,因为输入 initial @(posedge clk) 没有意义
    • 这可以通过在模块中设置一些标志来完成。喜欢always @(posedge clk) begin if(!flag) begin flag &lt;=1; // ... other logic here... end end。但这只是一个丑陋的解决方法。你的模块仍然存在。
    • 你能显示一些代码吗?有一个任务/功能而不是模块会很好。调用函数似乎是一个更好的主意
    • 其实我明白了..我用了一个临时标志,它起作用了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多