有人可以解释一下 System Verilog 中模块的控制流程吗

Can someone explain the control flow of modules in System Verilog

我知道如何 link 模块,但是有人可以解释一下在我想要使用模块时调用要使用的模块的流程。 就像有一个状态机并且根据状态我可以调用一个模块来激活,或者如果我需要重复一个过程如何回到状态机中更早的模块。

我又得到了这样的实例化部分

  wire clk;
  wire sig;
  wire out;

  A a(clk, sig, topout);
 B b(clk, sig);
endmodule

但是有人可以解释一下如何调用模块以及它们的控制流一般是如何工作的吗? (我是 HDL 的新手,所以非常感谢您的帮助)

如果您和我一样,那么您正在以软件程序员的背景来研究 Verilog。对程序线性执行的想法充满信心。你想到了有序执行。第 1 行在第 2 行之前...

Verilog 的核心是要同时执行所有行。一直以来。

这是一种非常并行的编程方式,在您掌握它之前,您将很难以正确的方式思考它。这不是普通软件的工作方式。 (我记得我花了几个星期才弄明白。)

您可以为同时执行的块添加条件前缀,即当条件为真时执行此块中的行。条件始终为真。其中一个 class 是时钟的上升沿:always @(posedge clk)。使用它会导致代码块 每次 clk 滴答(向上)执行一次。

模块不像子程序。它们更像是 C 宏——它们有效地在您放置它们的位置内联代码块。只要适用于它们的条件为真,这些代码块就会一直执行。通常,您根据模块参数的状态(或内部寄存器状态)来条件化模块的内部结构。正是通过共享参数实现的模块连接性确保了系统的逻辑协同工作。

Verilog 是一种专门为模拟硬件行为而开发的语言。硬件是一组晶体管和其他元素,它们总是静态呈现并并行运行。可以启用或禁用此类元素的功能,但硬件仍然存在。

Verilog 类似于硬件,因为它的所有元素始终存在,旨在并行运行。

Verilog 的基本功能元素是门、原语和程序块(即始终块)。这些块是通过电线连接的。

然后将所有这些元素分组到模块中。模块用于创建硬件模式的逻辑分区。它们不能是 'called'。它们可以以分层方式实例化以描述模型的逻辑结构。它们不能有条件地实例化,因为它们代表硬件。不同的模块实例通过导线连接,以表达较低级别元素之间的层次连接。

但是有一个例外,always 块的内容是纯软件。它描述了它的算法行为,因此,在 always 块中允许使用软件流构造(必须使用特定的考虑因素才能使其可综合)。

在仿真方面,Verilog 实现了一种事件驱动的仿真模式,旨在模拟硬件的并行执行。换句话说,仅当至少一个输入发生变化时,才会执行 Verilog 低级原语(门或始终块)。

通常在此类模型中使用的唯一流量控制是一系列输入事件和时钟。后者用于同步多个并行操作的结果并组织管道或其他顺序功能。

正如我之前提到的,硬件元素可以通过不同的方法 enabled/disabled,因此您可以通过在硬件描述中实现这些方法来进一步控制。例如,可以通过禁用模块使用的时钟信号来关闭特定模块内的所有硬件。电线或寄存器中可能有特定的 enable/disable 信号,等等。

现在回答您的问题:您的代码定义了几个模块的分层实例化。

module top(out);
 output wire out;

 wire clk;
 wire sig;

 A a(clk, sig, out);
 B b(clk, sig);
endmodule 

模块'top'(您的示例中缺少)包含另外两个模块A 和B 的实例。A 和B 是模块定义。它们被实例化为相应的实例 'a' 和 'b'。这些实例由信号 'clk' 连接,这可能是一个时钟信号,一些信号 'sig' 可能是一个模块的输出和另一个模块的输入。 'out' 是模块 top 的输出,它可能连接到另一个模块或更高层级的元素,此处未显示。

某种意义上的流量控制是由模块'A'和'B'之间的input/output关系定义的。例如:

module A(input clk, input sig, output out);
  assign out = sig;
  ...
endmodule

module B(input clk, output sig);
  always@(posedge clk) sig <= some-new-value;
  ...
endmodule

但是,一般来说,它是由模块内部元素的input/output关系定义的(在上面的例子中总是块)。 input/output 在模块端口级别主要用于语义检查。

在事件驱动仿真中,先执行哪个模块的硬件无关紧要。然而,一旦 'sig' 的值在模块 'B' 的 always@(posedge clk) 中发生变化,模拟将导致模块 'A' 中的硬件(assign 语句被评估(或重新评估)。这是您在此级别的流中表达序列的唯一方法。与硬件相同。