verilog可综合function使用
前言
上次发的博文使用了可综合task,综合上两者没有区别,但在仿真中,task在全部执行完毕才会赋值,所以可能导致多个task并发调用会不正确。
则可以使用function达到既可以综合也可以仿真。
目的
在进行多通道数据处理的时候,对于数据截位这样的操作,重复性的功能则可使用function进行预先定义,直接调用。
减少代码量及代码出错概率及后期修改容易程度。
注意
vivado支持function综合,但需保证function中的代码本来就是可以综合的。
function中只能使用组合逻辑。
代码验证
////截位function function [15:0] f_lpf_out_trc; input [17:0] f_lpf_in_data; if (f_lpf_in_data[17]) //如果是负数 begin if (&f_lpf_in_data[16:15] == 1'b0) f_lpf_out_trc = {f_lpf_in_data[17],{15{1'b0}}}; else f_lpf_out_trc = {f_lpf_in_data[17],f_lpf_in_data[14:0]}; end else //是正数 begin if (|f_lpf_in_data[16:15] == 1'b1) //溢出限幅 f_lpf_out_trc = {f_lpf_in_data[17],{15{1'b1}}}; else f_lpf_out_trc = {f_lpf_in_data[17],f_lpf_in_data[14:0]}; end endfunction
always @(posedge i_clk) begin r_lpf_m_axis_data_tdata_0_dout <= f_lpf_out_trc(w_lpf_m_axis_data_tdata[34:17]); end
以上。