宽度独立功能

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 工具中综合


ngu*_*rie 5

您可以创建参数化功能.见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上的工作示例.

  • @Ari不,我没试过.本文第5.6.7节:http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf谈到这一点. (2认同)