System verilog 有人能解释一下Verilog系统中模块的控制流程吗

System verilog 有人能解释一下Verilog系统中模块的控制流程吗,system-verilog,quartus,System Verilog,Quartus,我知道如何链接模块,但有人能解释一下当我想使用模块时调用模块的流程吗。 比如有一个状态机,根据状态,我可以调用一个模块来激活,或者如果我需要重复一个过程,如何返回到状态机中较早的模块 我再次得到了这样的实例化部分 wire clk; wire sig; wire out; A a(clk, sig, topout); B b(clk, sig); endmodule 但是,有人能解释一下如何调用模块以及控制流一般如何为它们工作吗? (我是HDL新手,因此我非常感谢您的帮助)

我知道如何链接模块,但有人能解释一下当我想使用模块时调用模块的流程吗。 比如有一个状态机,根据状态,我可以调用一个模块来激活,或者如果我需要重复一个过程,如何返回到状态机中较早的模块

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

  wire clk;
  wire sig;
  wire out;

  A a(clk, sig, topout);
 B b(clk, sig);
endmodule
但是,有人能解释一下如何调用模块以及控制流一般如何为它们工作吗?
(我是HDL新手,因此我非常感谢您的帮助)

如果您像我一样,那么您正在以软件程序员的背景查看Verilog。坚信程序是线性执行的。你想到的是有秩序的执行。第1行在第2行之前

Verilog的核心是希望同时执行所有行。一直如此

这是一种非常并行的编程方式,在你得到它之前,你将努力思考正确的编程方式。这不是普通软件的工作方式。(我记得我花了几个星期的时间才弄明白这一点。)

您可以在同步执行的块前面加上条件,即当条件为true时执行该块中的行。条件始终为真。这种情况的一类是时钟的上升沿:
总是@(posedge-clk)
。使用此选项将导致每次
clk
滴答声(向上)时执行一次的代码块


模块与子例程不同。它们更像C宏——它们有效地将代码块内联到您放置它们的位置。这些代码块在任何适用于它们的条件为真时始终执行。通常根据模块参数的状态(或内部寄存器状态)对模块的内部进行条件化。模块通过共享参数的连接性确保了系统逻辑的协同工作。

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

Verilog与硬件的相似之处在于,它的所有元素都始终存在,旨在实现并行功能

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

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

但是有一个例外,always块的内容是纯软件。它描述了它的算法行为,因此,软件流构造允许在always块内(必须使用特定的注意事项使其可合成)

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

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

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

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

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”之间的输入/输出关系定义。例如:

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
模块A(输入时钟、输入信号、输出);
分配=sig;
...
端模
模块B(输入时钟、输出信号);

永远@(posedge clk)sig感谢您的观点。因此,是否可能有一个顶部模块的有限状态机,在某些状态下,它向另一个模块发送信号,如
always@(posedge clk)
中的clk信号,在某个模块内,这将导致其内的语句播放,然后让被调用的模块将信号发送回顶部模块的状态机以使其继续?是。这将通过模块的参数值进行调解。模块输入参数宣布请求准备就绪,模块输出参数宣布响应准备就绪。