在verilog中使用always块时出错

在verilog中使用always块时出错,verilog,Verilog,我在verilog中有一个模块temp1,如下所示- module temp1; --- --- --- endmodule 我想从其他模块调用此模块实例temp2。然而,我想让这条路走在时钟的正边缘- module temp2(clk); input clk; always @(posedge clk) temp1 t1; endmodule 这给了我语法错误。似乎我不应该从always块中调用任何模块。我们不能从始终块中创建模块实例,这是真的吗?如果是,我

我在verilog中有一个模块
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