1

我在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));

我得到了错误:

'在文本“m0”附近的 seqalign.v(139) 处出现 Verilog HDL 语法错误;期待“<=”或“=”

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

另附注: verilog 中模块的实例化

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

seqalign.v(88) 的 HDL 语法错误,靠近文本“(”;期待“;”

4

1 回答 1

2

查看您在评论中发布的代码,问题出always @(posedge clk)在第 70 行的块内实例化模块。您永远不会在程序块内实例化模块(总是,初始等)。

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

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

你可以做两件事之一来解决你的问题。一种是将您的任务从子模块移动maximumsystolic_PE模块中,并通过调用它来使用它来获取变量的最大值(第 123 行会变成类似的东西tempA <= convert(.a(0), .b(diag+match));并添加为您的任务的输入)ab或者,在 always 块之外实例化模块,但您需要将任务更改为程序块,就像您在实际帖子中所做的那样。

于 2015-01-27T18:21:48.160 回答