在verilog中使用always block时出错

时间:2015-11-15 11:17:59

标签: verilog

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

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

我想从其他模块temp2调用此模块实例。但是,我希望这个时钟的正边缘 -

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

这给了我语法错误。看来我不应该在always块中调用任何模块。我们不能在always块内创建模块的实例是真的吗?如果是的话,我怎么能以其他方式做到这一点,因为我必须在时钟的时候调用temp1?

1 个答案:

答案 0 :(得分:1)

在verilog中,当您实例化模块时,这意味着您要向主板添加额外的硬件

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

实例化后,模块将执行/检查模拟的每个时间戳,直到结束。

所以要执行任何模块,只是实例化它,提供clk和其他所需的输入,在子模块中添加always块。< / p>

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提供生成块,用于创建同一模块的多个实例

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 temp;
// ...
endtask: temp

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

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