如果VHDL或verilog代码中的for循环变量是变量,会发生什么情况?

如果VHDL或verilog代码中的for循环变量是变量,会发生什么情况?,vhdl,verilog,Vhdl,Verilog,如果我在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 模块dut(输入时钟、d

如果我在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
模块dut(输入时钟、d、输出寄存器[5:0]q);
整数i,j,k,l;
始终@(posedge clk)
开始
对于(i=k;j<4;k++,l++)开始
q[i]
问题是什么

问题是您只能在模拟中使用代码。也就是说:您将无法合成代码并从中生成硬件

在合成中,展开for循环,并为循环中的每个步骤生成硬件。为此,合成工具必须在编译时知道循环执行的频率

问题是什么

问题是您只能在模拟中使用代码。也就是说:您将无法合成代码并从中生成硬件


在合成中,展开for循环,并为循环中的每个步骤生成硬件。为此,合成工具必须在编译时知道循环执行的频率

for
可以写成
do-while
循环

for(<Initialization>;<Condition>;<Iteration>) <Statement>;

<Initialization>;
do
 begin
 <Statement>;
 <Iteration>;
end
while (<Condition>);
(;;)的
;
;
做
开始
;
;
结束
while();
因此,一旦执行了子句
i=k
,那么
k
的值发生了什么变化就无关紧要了


综合要求在编译时计算循环迭代的总数。您必须提供可在编译时计算的表达式。因此,如果开始和结束的迭代值不是常量,则循环将不可合成

for
可以写成
do-while
循环

for(<Initialization>;<Condition>;<Iteration>) <Statement>;

<Initialization>;
do
 begin
 <Statement>;
 <Iteration>;
end
while (<Condition>);
(;;)的
;
;
做
开始
;
;
结束
while();
因此,一旦执行了子句
i=k
,那么
k
的值发生了什么变化就无关紧要了

综合要求在编译时计算循环迭代的总数。您必须提供可在编译时计算的表达式。因此,如果开始和结束的迭代值不是常量,则循环将不可合成

在VHDL IEEE Std 1076.6-2004(RTL合成,撤销)8.8.9循环语句中,离散范围的边界应直接或间接指定为属于整数类型的静态值。IEEE标准1076-2008 9.4静态表达式将这些表达式限制在局部(9.4.2)或全局(9.4.3)静态范围内。间接包括枚举值的位置号(5.2标量类型,5.2.2枚举类型)。离散范围(5.3.2.1)包括范围表达式、子类型指示(6.3)和范围属性(5.2.1)。在VHDL IEEE Std 1076.6-2004(RTL合成,撤销)8.8.9循环语句中,离散范围作为参数规范的一部分出现,离散范围的边界应直接或间接指定为属于整数类型的静态值。IEEE标准1076-2008 9.4静态表达式将这些表达式限制在局部(9.4.2)或全局(9.4.3)静态范围内。间接包括枚举值的位置号(5.2标量类型,5.2.2枚举类型)。离散范围(5.3.2.1)包括范围表达式、子类型指示(6.3)和范围属性(5.2.1)。