参数化模块 (SystemVerilog)
Parameterized Modules (SystemVerilog)
我读过 David Harris 的书 "Digital Design and Computers Architecture",我对本书中的 SystemVerilog 示例有疑问。在"parameterized construction"中引入后,即# (parameter ...)
,几乎每个例子都会用到这个运算符。
例如本书中的"subtractor"模块:
module subtractor #(parameter N = 8)
(input logic [N - 1:0] a,b,
output logic [N - 1:0] y);
assign y = a - b;
endmodule
在这段代码中使用 N
的原因是什么?
我们不能只写下面的吗?:
input logic [7:0] a,b,
output logic [7:0] y);
此外,本书后面的几乎每个示例都使用了此类参数,但对我而言,没有理由使用它。 我们可以直接在方括号中设置位数,不用额外的 "parameters".
那么,上面这种编码形式的原因是什么?
参数的使用有多种用途。
- 使用与值关联的符号名称总是比直接使用文字值更好的编程习惯。
DATA_WIDTH
而不是 N
会是一个更合适的例子。这记录了值的含义。
- 当需要更改该值时,您可以在一个地方进行更改,而且您错过更改或更改意外值的可能性更小。
- 通过使用参数,您可以 re-use 通过创建模板然后根据需要覆盖参数值,在许多不同的地方使用相同的代码。
我读过 David Harris 的书 "Digital Design and Computers Architecture",我对本书中的 SystemVerilog 示例有疑问。在"parameterized construction"中引入后,即# (parameter ...)
,几乎每个例子都会用到这个运算符。
例如本书中的"subtractor"模块:
module subtractor #(parameter N = 8)
(input logic [N - 1:0] a,b,
output logic [N - 1:0] y);
assign y = a - b;
endmodule
在这段代码中使用 N
的原因是什么?
我们不能只写下面的吗?:
input logic [7:0] a,b,
output logic [7:0] y);
此外,本书后面的几乎每个示例都使用了此类参数,但对我而言,没有理由使用它。 我们可以直接在方括号中设置位数,不用额外的 "parameters".
那么,上面这种编码形式的原因是什么?
参数的使用有多种用途。
- 使用与值关联的符号名称总是比直接使用文字值更好的编程习惯。
DATA_WIDTH
而不是N
会是一个更合适的例子。这记录了值的含义。 - 当需要更改该值时,您可以在一个地方进行更改,而且您错过更改或更改意外值的可能性更小。
- 通过使用参数,您可以 re-use 通过创建模板然后根据需要覆盖参数值,在许多不同的地方使用相同的代码。