Verilog模块实例化

Verilog模块实例化,verilog,intel-fpga,quartus,Verilog,Intel Fpga,Quartus,我在verilog中实例化模块时遇到了一些问题。我正在使用AlteraQuartus平台开发和模拟verilog代码 我遵循了这个例子(以及其他几个例子): 我已经编写了一个模块(最大值),它可以找到两个有符号输入之间的最大值 我正在开发的另一个模块是用于基因序列比对的脉动阵列。细节并不重要,但是当我尝试实例化一个最大模块时,我得到了一个错误 这是我目前的代码: module maximum (a, b, out); input signed [15:0] a; input signed [1

我在verilog中实例化模块时遇到了一些问题。我正在使用AlteraQuartus平台开发和模拟verilog代码

我遵循了这个例子(以及其他几个例子):

我已经编写了一个模块(最大值),它可以找到两个有符号输入之间的最大值

我正在开发的另一个模块是用于基因序列比对的脉动阵列。细节并不重要,但是当我尝试实例化一个最大模块时,我得到了一个错误

这是我目前的代码:

module maximum (a, b, out);
input signed [15:0] a;
input signed [15:0] b;
output reg signed [15:0] out;
  always @* begin
    if (a>b)
      assign out = a;
    else
      assign out = b;
  end
endmodule
我在另一个模块systolic_PE中实例化(所有这些都在同一个文件seqalign.v中)

我得到了一个错误:

'文本“m0”附近seqalign.v(139)处的Verilog HDL语法错误;期望
“查看您在评论中发布的代码,问题在于在第70行的
always@(posedge clk)
块中实例化模块。您从未在过程块(always、initial等)中实例化模块

由于Verilog是一种硬件描述语言,在编写代码时,你必须处于设计硬件的心态。模块实例化就像将一个芯片焊接到PCB上,在设计时,你要么做,要么不做,并且该组件始终保持在那里。你不会说,好吧,我希望有一段时间把这个芯片放在这里,但请记住当系统进入这些状态时,PCB。在代码中,如果状态为3,则有条件地实例化模块。但是,状态会随时间而变化。这类似于说,当包含状态的寄存器读取3时,将此芯片放入系统,否则,它不存在并取出。在代码级别上,考虑实例化的mo模块作为它们自己的过程块,就像您不总是将模块放在其他始终块中一样,也不将模块放在始终块中(当然,模块定义/声明可以始终将块放在它们内部)

模块是持久的且编译时不变,因此您可以使用generates在编译时有条件地实例化模块(即,在构建系统时决定是否在设计中包含模块)。但在您的代码中,您是在模拟时有条件地实例化的,这是如上所述不允许的


你可以做两件事中的一件来解决你的问题。一件是将你的任务从子模块
maximum
移动到
systolic\u PE
模块,并通过调用它来获得变量的最大值(第123行将变成类似于
tempA的内容。首先,不要在always块中使用
assign
:删除实现并单独使用空模块,然后重试。谢谢Greg,我现在已经更改了它。Eugene Sh:我尝试了你的建议,它确实有效。它编译得很好。因此,我的问题在于我正在尝试在包含if和always等的代码块中实例化模块。我已将代码上载到pastebin。请注意:它不完整,因此逻辑不完整。您或任何人能否向我说明如何在if/always块中使用最大模块?我必须使用生成块吗?谢谢您,Unn!非常有用,informative..我已按照您的建议将子模块移动到systolic_PE模块中。我遇到了一个错误,即嵌套子模块是SystemVerilog的一个功能。好..因此我已还原更改,并尝试在第123行中执行任务转换,但得到“无法解析对对象的引用”转换。忽略以上内容。我已经意识到您将任务移动到收缩功能中的意思。这解决了我的问题,但是您对line123的建议是为了函数。尽管如此,非常感谢您的帮助!我为未来的任何人更新的代码:您是对的,我写这篇文章时考虑的是函数,而不是任务。您应该如果你也能使用任务,它看起来就不一样了:)
maximum m0(.a(tempB), .b(diag), .out(tempA));