以下代码不管输入如何,都给出输出(“事实”)1。有什么错误?
module Factorial_calc(n, fact);
input [5:0] n;
output reg [64:0] fact;
reg [5:0] i;
initial
begin
i=n;
fact=1;
end
always @(*)
begin
while(i>0)
begin
fact=i*fact;
i=i-1;
end
end
答案 0 :(得分:1)
Verilog不会阻止您在初始块内为网络的价值分配reg,但是您极不可能获得预期的结果。
一个initial
块在时间0处运行。在分配给reg之前,网络可能没有预期的值。通过设计,Verilog允许在时间步骤的同一阶段内不确定过程块和有争议的分配的评估顺序。 Verilog的评估顺序可以通过事件依赖性来控制。 initial
块没有事件相关性,因此将始终对其进行评估。网络将具有依赖性(除非将它们分配给常量),因此通常会在以后进行评估。
使代码正常工作的最小更改是将初始块的内容移至while语句上方的always块内。每次输入i
发生更改并更新n
时,fact
都会更新,always @(*)
begin
i = n; // <-- local sample
fact = 1; // local reset
while(i>0)
begin
fact=i*fact;
i=i-1;
end
end
在while循环中更新之前。
Driver.FindElementByCssSelector("xxx", "Welcome to (My) Company");
这将适用于模拟,但由于使用了while语句,因此无法进行合成。