在verilog中使用always块时出错
我在verilog中有一个模块在verilog中使用always块时出错,verilog,Verilog,我在verilog中有一个模块temp1,如下所示- module temp1; --- --- --- endmodule 我想从其他模块调用此模块实例temp2。然而,我想让这条路走在时钟的正边缘- module temp2(clk); input clk; always @(posedge clk) temp1 t1; endmodule 这给了我语法错误。似乎我不应该从always块中调用任何模块。我们不能从始终块中创建模块实例,这是真的吗?如果是,我
temp1
,如下所示-
module temp1;
---
---
---
endmodule
我想从其他模块调用此模块实例temp2
。然而,我想让这条路走在时钟的正边缘-
module temp2(clk);
input clk;
always @(posedge clk)
temp1 t1;
endmodule
这给了我语法错误。似乎我不应该从always块中调用任何模块。我们不能从
始终
块中创建模块实例,这是真的吗?如果是,我如何以其他方式实现这一点,因为我只有在时钟处于posedge时才能调用temp1?在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提供了一个生成块,用于创建同一模块的多个实例
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
有关实例化的更多信息可以从,链接中获得。谢谢,但是如果我必须只在时钟的第一个正边缘调用一个模块,然后我不想调用它。在这种情况下,我怎么做呢?因为在初始块中调用模块是不起作用的。我不想在我的模块中放入initial,因为放入
initial@(posedge clk)
没有意义这可以通过在模块中设置一些标志来实现。像always@(posedge clk)begin if(!flag)begin flag可以显示一些代码。最好有一个任务/函数而不是模块。调用这个函数似乎是一个更好的想法。实际上我有了这个想法。我使用了一个临时标志,它起了作用。非常感谢
task temp;
// ...
endtask: temp
module temp2(clk);
input clk;
always @(posedge clk)
temp1(); // task/function temp
endmodule