假设在一个程序中,我写这个函数来分割2个值:
function [63:0] DIV_VAL; // Function for Multiplying two values 32 bits.
input [63:0] a, b;
always @ (a or b)
DIV_VAL = a / b;
endfunction
然后在代码中我想用输入Znk1 BUT调用此函数,将它们旋转16位和12位(函数的第一个和第二个参数)。此外,由于函数DIV_VAL用64位数回答我,我只想从它那里得到32位,加载到NC_1:像这样。
NC_1 = DIV_VAL [31:0] (Znk1 << 16, Znk1 >> 12) ;
这是允许的吗,它有效吗?我也不确定订单。
第二个问题:作为这种情况的替代方案,一位朋友告诉我,我可以定义一些寄存器,如a,b,并使用它们来做这样的事情:
a = Znk1 << 16;
b = Znk1 >> 12;
NC_1 = DIV_VAL [31:0] (a, b);
NC_1 = NC_1[31:0];
答案 0 :(得分:1)
您无法在always
内放置function
块。你的功能应该是:
function [63:0] DIV_VAL; // Function for Multiplying two values 32 bits.
input [63:0] a, b;
DIV_VAL = a / b;
endfunction
或者你使用过时的风格写作,或许:
function [63:0] DIV_VAL (input [63:0] a, b); // Function for Multiplying two values 32 bits.
DIV_VAL = a / b;
endfunction
如果您愿意,可以在函数调用中使用表达式调用函数:
NC_1 = DIV_VAL (Znk1 << 16, Znk1 >> 12) ;
但不允许显式截断返回值。但是你不需要明确地截断,Verilog将隐式地进行截断。 (因此上述代码中没有[31:0]
。)