我可以用verilog(用间接参数调用函数)来写这个吗?

时间:2016-11-11 06:16:32

标签: function verilog

假设在一个程序中,我写这个函数来分割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];

1 个答案:

答案 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]。)