先放代码:
wire [width-1:0]din;
wire [width-1:0]dout;
function [width-1:0]DWF_absval; input [width-1:0]A; begin DWF_absval = ((^(A^A)) != 1‘b0) ? {width{1‘bx}} : ( A[width-1]==0) ? A : (-A) ); end endfunction
assign dout = DWF_absval(din); %调用函数
这里涉及两个语法点
1)function标准写法:
function <返回值位宽>函数名; <端口说明语句> <变量类型说明语句> begin 语句 …… 函数名 = zzzz ; end endfunction
【注】0.函数在调用时:函数名(端口名);
1.函数定义中不能出现任何时间控制语句:#、@、wait
2.函数不能启动任务task
3.如果function是要综合的,那么必须所有分支按照组合逻辑写,且都要赋值
2)缩减运算符
out = ^din : 是将din按位异或,缩减成一位的结果;
((^(A^A)) != 1‘b0) ? {width{1‘bx}} :意思是 判断A是否存在不定态或高阻态,若A中某1bit出现了,则(A^A)不等于0,则缩减输出为4‘bxxxx;
原文:https://www.cnblogs.com/gmh1996/p/12880945.html