【问题标题】:What happens if for loop variable in VHDL or verilog code is variable?如果 VHDL 或 verilog 代码中的 for 循环变量是变量会发生什么?
【发布时间】:2018-08-06 09:32:09
【问题描述】:

如果我在 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

会有什么问题?

【问题讨论】:

  • 在 VHDL IEEE Std 1076.6-2004(RTL 综合,撤销)中 8.8.9 循环语句 对于作为参数规范的一部分出现的离散范围,离散范围的边界应为直接或间接指定为属于整数类型的静态值。 IEEE Std 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 verilog


【解决方案1】:

会有什么问题?

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

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

【讨论】:

    【解决方案2】:

    for 可以写成do-while 循环

    for(<Initialization>;<Condition>;<Iteration>) <Statement>;
    
    <Initialization>;
    do
     begin
     <Statement>;
     <Iteration>;
    end
    while (<Condition>);
    

    所以一旦子句i=k执行,k 的值会发生什么变化并不重要。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2019-12-20
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多