有一个包含巨大数据数组的reg变量。该变量在模块内声明并初始化。
我在 Verilog 模块内创建了一个函数来访问此外部数据。令人惊讶的是,我能够毫无困难地做到这一点。
那么,当函数只能访问外部变量时,我是否应该将值作为输入传递给函数?
这是一个代码示例来说明我的意思
module TestModule (
input clock,
output Out
);
// Variable declared outside the function
reg [7:0] externalVariable [10:0];
// Function declaration
function [7:0] myFunction;
input arg;
begin
myFunction = externalVariable[arg];
end
endfunction
always @(posedge clock) begin
// Assign a value to the external variable
Out <= myFunction(1);
end
endmodule
我模拟了上面的例子,它有效。但为什么呢?
模块创建一个范围,变量
externalVariable
在TestModule范围内。您的函数不返回任何内容,它只是对模块变量进行操作。当您的代码所在时,我认为没有任何理由增加复杂性。如果您在多个地方使用此函数,我认为可能很难判断发生了什么,在这种情况下,我会添加一个输入参数、一个返回值并将函数存储声明为
automatic
。
声明
automatic
函数使其可重入,导致每次调用时动态分配存储空间,而不是在任务的不同调用之间共享变量。
声明函数自动看起来像这样
function automatic [7:0] myFunction;
请参阅 IEEE 1800 第 13.4 节“函数”了解更多信息。