有模块时为什么要在verilog中使用函数

use*_*492 5 verilog hdl hardware-programming

第 1 部分

我总是被告知使用 Verilog 中的函数来避免代码重复。但是我不能用模块来做到这一点吗?如果我的理解是正确的,除了不能从 always 块内部实例化模块之外,所有函数都可以在 Verilog 中重写为模块。除了在这种情况下,我总是可以坚持使用模块。我对么?

第 2 部分

如果我是对的,为什么 Verilog 编译器不能以模块得到函数处理的方式编写?我的意思是,为什么编译器不能允许程序员在 n 块内实例化一个模块并停止支持函数?

Ser*_*rge 5

  1. 模块 != 功能。它们在 verilog 中的用法完全不同。

函数实际上是扩展表达式,它用于表达式中。它可以用在'assign' 语句的rhs 表达式或任何程序块内的表达式中。

  • 函数不能消耗时间。

  • 函数必须返回一个值。


模块用于表示硬件层次结构并包含并发程序块(可能包含函数)。

  • 模块可能会消耗时间。

  • 模块不能返回值。(输出端口不是返回值)


潜在地,您可以创建一个函数来替换单个 always 块的内部结构,并使用返回函数的 always 块编写等效模块。但就是这样。

  1. 你不正确:)。Verilog 编译器不能以这种方式编写,因为每个 verilog 编译器都必须遵循一个 verilog 标准。否则它不会是verilog。