在函数中使用for循环时,我对verilog中的时序有一些疑问。
如何估计执行for循环运行功能所需的时钟周期?
如何估算一次循环迭代所需的时钟时间。
函数是否像中断一样工作。例如:如果我在顺序逻辑中调用一个函数,那么在函数完成之前一切都会暂停?
[更新] 这里有一些关于我正在使用for循环的更多信息。
integer n;
always@(posedge CLK)
if(IN) // some input wire IN
begin
n = n + 1;
Result[31:0] <= Approx(n); //put Result from Approx into output reg Result
end
function [31:0] Approx
input n;
integer n;
real fp; //some real number to store the approximation result
begin
for(integer i=0; i < 2**16; i=i+1)
begin
... // do Approximation within fixed iteration steps
... // Result is a floating point number
end
Approx[31:0] = convert_fp_to_bin(fp); //another function with for-loop to convert decimal number into binary number
end
....
答案 0 :(得分:1)
Verilog函数构造不允许延迟或任何时序结构(例如#
,@
,wait
等);即,不允许函数采用任何超过0的模拟时间。因此,函数将始终在0时间内完成,因此0个时钟周期。函数内部肯定允许For循环,但是,这些for循环必须没有任何计时结构,因此它们将在0时间内执行。因此,如果在任何地方进行函数调用,函数将运行并且在执行该行时确定一个值(通常,可能存在奇怪的情况,这不是真的,但您必须检查LRM以获取信息在这些情况下)。
举一个简短的例子,假设你有一个名为flip
的函数,只需翻转给定的4位向量的位。然后,假设您有以下代码:
initial begin
...
a = flip(b);
... // No timing constructs in here
#10;
...
end
always @(*) begin
d = flip(a);
end
当初始程序段到达行a = flip(b)
时,a
将得到b
的值,该位将反转(即,函数将运行,返回的值和{{1分配给该值)。初始阻止命中a
后,始终阻止可能会触发并分配#10
d
的值将翻转位(即a
的值)。因此,在回答第3个问题时,函数是内联执行的。请注意,如果您在函数中调用b
,则可能会混淆此函数,但对于基本函数,您可以将它们视为内联函数。