function与计算有符号数绝对值

先放代码:


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; 

 

posted @ 2020-05-13 10:41  gmh1996  阅读(252)  评论(0)    收藏  举报