我需要将大型(可综合)VHDL-93 代码库移植到 Verilog-2005。
我对 VHDL 非常熟悉,但对 Verilog 还很陌生。
两种语言之间的许多事情都清楚地对应,但我完全被函数所困扰。特别是,我有几十个 VHDL 函数它们对任意长度的向量进行操作,但我找不到在 Verilog 中执行相同操作的方法。
举个例子,想象一个 VHDL 函数反转向量中的位,如 this:
function reverse(a : in std_logic_vector) return std_logic_vector is
variable result : std_logic_vector(a'RANGE);
alias aa : std_logic_vector(a'REVERSE_RANGE) is a;
begin
for i in aa'RANGE loop
result(i) := aa(i);
end loop;
return result;
end;
看起来SystemVerilog 或许可以使用虚拟类中的静态函数或使用看起来可怕的预处理器宏来实现类似的效果。但我还没有找到任何关于 Verilog-2005 的信息。
据我了解,Verilog 函数不支持参数(就像 Verilog 模块一样),也不支持无界向量。那么,Verilog 用户将如何解决这个问题呢?他们会为每个函数调用实例化不同的(参数化)模块吗?或者有更好的办法吗?
我确实搜索了位反转的具体示例,但是every...single...answer我发现建议了一些inline
generate for
循环的变体(或者有硬编码位) -宽度)。我的函数在代码库中被调用了数百次,所以我当然不想用一堆混乱的代码替换每个干净的函数调用。
我最好的尝试是在
reverse
模块中使用这个 reverser
函数。这至少可以通过模块参数WIDTH
进行参数化。但我不认为我真的想要一个模块......我只是想要这个功能。
module reverser
#(
parameter WIDTH = 5
)
(
input wire [WIDTH-1:0] x,
output wire [WIDTH-1:0] y
);
function [WIDTH-1:0] reverse(
input [WIDTH-1:0] data
);
integer i;
begin
for (i=0; i < WIDTH; i=i+1) begin
reverse[WIDTH-1-i] = data[i];
end
end
endfunction
assign y = reverse(x);
endmodule
看起来唯一阻止您在虚拟类方法中使用静态函数的是这个注释:
无法在旧的 Verilog 模块中导入 SystemVerilog 类。
我建议通过简单地更改文件扩展名来将 Verilog 文件 (.v) 编译为 SystemVerilog (.sv)。 Verilog 100% 向前兼容 SystemVerilog。
现在您有了 SystemVerilog 设计,并且可以在虚拟类中使用静态函数来获取参数化函数行为。