Ari*_*Ari 8 verilog system-verilog
是否可以编写一个可以自动检测输入数据宽度的函数?例如,考虑下面的奇偶校验功能:
function parity;
input [31:0] data;
parity = ^ data;
endfunction
Run Code Online (Sandbox Code Playgroud)
当parity(data)被调用时,输入数据应当被限制在32位.
或者,可以编写一个宏,例如 `PARITY(data)系统函数$bits可以检测数据的宽度并使宏与宽度无关.是否可以为功能提供相同的灵活性?
编辑:我需要我的代码可以合成.
小智 7
您可以使用宏。该函数可以这样声明:
`define PARITY(FUNC_name, WIDTH) \
function FUNC_name (input [WIDTH-1:0] data); \
begin \
FUNC_name = ^ data; \
end \
endfunction
Run Code Online (Sandbox Code Playgroud)
你可以这样调用它:
`PARITY(parity, 32);
assign parity_bit = parity(data);
Run Code Online (Sandbox Code Playgroud)
该代码可在 xilinx、altera 和 synopsys 工具中综合
您可以创建参数化功能.见LRM第13.8节.看起来函数必须在类这样的类中声明:
virtual class C #(parameter WIDTH=32);
static function parity (input [WIDTH-1:0] data);
parity=^data;
endfunction
endclass
Run Code Online (Sandbox Code Playgroud)
然后,当您使用bits任务调用函数参数化时:
assign parity_bit = C#($bits(data))::parity(data);
Run Code Online (Sandbox Code Playgroud)
EDA Playground上的工作示例.
| 归档时间: |
|
| 查看次数: |
8039 次 |
| 最近记录: |