我在verilog中有一个模块temp1
,如下所示, -
module temp1;
---
---
---
endmodule
我想从其他模块temp2
调用此模块实例。但是,我希望这个时钟的正边缘 -
module temp2(clk);
input clk;
always @(posedge clk)
temp1 t1;
endmodule
这给了我语法错误。看来我不应该在always块中调用任何模块。我们不能在always
块内创建模块的实例是真的吗?如果是的话,我怎么能以其他方式做到这一点,因为我必须在时钟的时候调用temp1?
答案 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 Instantiation,Instantiating Modules and Primitives,Structural Modelling链接获取有关实例化的更多信息。