Verilog模块实例化

时间:2015-01-26 20:09:54

标签: verilog intel-fpga quartus

我在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语法错误在seqalign.v(139)附近文本" m0&#34 ;;期待   "< ="或" ="'

我检查了到目前为止所做的一切,我似乎无法看到任何我错过的东西......有人能够引导我吗?

另请注意: Instantiation of a module in verilog

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

  

在文本附近的seqalign.v(88)处出现HDL语法错误"(&#34 ;;期待&#34 ;;"

1 个答案:

答案 0 :(得分:1)

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

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

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

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