我们可以在“ initial”块中使用“ nets”而不是常量来初始化变量吗?

时间:2019-02-14 12:50:32

标签: verilog

以下代码不管输入如何,都给出输出(“事实”)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

1 个答案:

答案 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语句,因此无法进行合成。