Verilog 模块实例化

Verilog module instantiation

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

我遵循了这个例子(以及其他几个例子): http://www.asic-world.com/verilog/verilog_one_day4.html

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

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

到目前为止,这是我的代码:

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)

maximum m0(.a(tempB), .b(diag), .out(tempA));

我收到错误:

'Verilog HDL syntax error at seqalign.v(139) near text "m0"; expecting "<=" or "="'

我检查了我到目前为止所做的一切,我似乎看不到任何我遗漏的东西.. 任何人都可以指导我吗?

另外附注: Instantiation of a module in verilog

我试图在 if 语句中实例化我的模块,所以我在 always @(posedge clk) 块中尝试在 if 语句之外,但我得到了错误

HDL syntax error at seqalign.v(88) near text "("; expecting ";"

查看您在评论中 post 编辑的代码,问题出在第 70 行的 always @(posedge clk) 块内实例化模块。您永远不会在程序块内实例化模块(总是,首字母等)。

由于 Verilog 是一种硬件描述语言,因此您在编写代码时必须本着设计硬件的心态。模块实例化就像将芯片焊接到 PCB 上,在设计时你要么做,要么不做,并且该组件一直保留在那里。你不会说,好吧,有时我想要这个芯片,但是当系统进入这些状态时,把它从 PCB 上拿下来。在您的代码中,如果状态为 3,则有条件地实例化您的模块。但是,状态会随时间而变化。所以这类似于说,当包含状态的寄存器读取到 3 时,将此芯片放入系统中,否则,它不存在并取出。在代码层面上,将实例化模块视为它们自己的程序块,就像您不要将 always 放在其他 always 中一样,不要将模块放在 always 块中(当然,module definitions/declarations 里面总是可以有块)。

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

您可以选择以下两种方法之一来解决您的问题。一种方法是将您的任务从您的子模块 maximum 移动到 systolic_PE 模块并使用它来通过调用它来获取变量的最大值(第 123 行将变成类似于 tempA <= convert(.a(0), .b(diag+match));添加 ab 作为任务的输入)。或者,在 always 块之外实例化模块,但您需要将任务更改为程序块,就像您在实际 post.

中所做的那样