如果 VHDL 或 verilog 代码中的 for 循环变量是变量会怎样?
What happens if for loop variable in VHDL or verilog code is variable?
如果我在VHDL或Verilog中为for循环变量的初始值赋一个非常量值,在仿真或综合中会出现什么问题?
例如-如果我写一个测试用例:
module dut(input clk, d, output reg [5:0] q);
integer i, j, k, l;
always @(posedge clk)
begin
for(i =k;j < 4;k++, l++) begin
q[i] <= d;
end
end
endmodule
会出现什么问题?
What will be the issue?
问题是您只能在模拟中使用代码。也就是说:您将无法合成代码并从中生产硬件。
在综合过程中,展开 for 循环并为循环中的每一步生成硬件。为此,综合工具必须在编译时知道循环执行的频率。
一个for
可以写成一个do-while
循环
for(<Initialization>;<Condition>;<Iteration>) <Statement>;
<Initialization>;
do
begin
<Statement>;
<Iteration>;
end
while (<Condition>);
所以一旦 i=k
子句执行,k
.
的值发生什么变化都无关紧要
综合要求在编译时计算循环迭代的总数。您必须提供可以在编译时求值的表达式。因此,如果开始和结束迭代值不是常量,则很可能无法合成循环。
如果我在VHDL或Verilog中为for循环变量的初始值赋一个非常量值,在仿真或综合中会出现什么问题? 例如-如果我写一个测试用例:
module dut(input clk, d, output reg [5:0] q);
integer i, j, k, l;
always @(posedge clk)
begin
for(i =k;j < 4;k++, l++) begin
q[i] <= d;
end
end
endmodule
会出现什么问题?
What will be the issue?
问题是您只能在模拟中使用代码。也就是说:您将无法合成代码并从中生产硬件。
在综合过程中,展开 for 循环并为循环中的每一步生成硬件。为此,综合工具必须在编译时知道循环执行的频率。
一个for
可以写成一个do-while
循环
for(<Initialization>;<Condition>;<Iteration>) <Statement>;
<Initialization>;
do
begin
<Statement>;
<Iteration>;
end
while (<Condition>);
所以一旦 i=k
子句执行,k
.
综合要求在编译时计算循环迭代的总数。您必须提供可以在编译时求值的表达式。因此,如果开始和结束迭代值不是常量,则很可能无法合成循环。