Vhdl 为for generate语句中的信号赋值

Vhdl 为for generate语句中的信号赋值,vhdl,variable-assignment,generate,Vhdl,Variable Assignment,Generate,我无法理解为什么下面示例中“sig2”的信号分配不会成功,而“sig1”的信号分配会成功。随着时钟上升沿,“sig2”变为“X” 原因是什么 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; use IEEE.STD_LOGIC_UNSIGNED.all; entity Test_tb is end entity Test_tb; architecture Structural of Test_tb i

我无法理解为什么下面示例中“sig2”的信号分配不会成功,而“sig1”的信号分配会成功。随着时钟上升沿,“sig2”变为“X”

原因是什么

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity Test_tb is
end entity Test_tb;

architecture Structural of Test_tb is

    signal sig1 : std_logic_vector (3 downto 0) := (others => '0');
    signal sig2 : std_logic_vector (7 downto 0) := (others => '0');
    signal clk : std_logic := '0';

begin
    clk_generate: process is
    begin
        wait for 5 ns;
        clk <= not clk;        
    end process clk_generate;

    gen_label : for gen_indx in 0 to 3 generate
    begin
        process (clk) is 
        begin
            if clk = '1' and clk'event then
                sig1 (gen_indx) <= '1';
                for loop_indx in 0 to 1 loop
                    sig2 (gen_indx * 2 + loop_indx) <= '1';
                end loop;
            end if; 
        end process;
    end generate gen_label;

end architecture Structural;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
使用IEEE.STD_LOGIC_UNSIGNED.all;
实体测试是
终端实体测试;
Test_tb的结构是
信号sig1:std_逻辑_向量(3到0):=(其他=>'0');
信号sig2:std_逻辑_向量(7到0):=(其他=>'0');
信号时钟:标准逻辑:='0';
开始
clk_生成:过程为
开始
等待5ns;

clk这是因为,当在for循环内分配信号时,假设驱动器影响阵列(或记录)的所有元素。这是因为它不能在精化时计算出for循环的边界,因为它是一个运行时概念。这不同于在精化时可以推导边界的生成循环

因此,您需要从进程内部删除for循环,或者创建一个分配给外部sig2的generate循环的本地信号。例如:

gen_label : for gen_indx in 0 to 3 generate
  signal local_sig  : std_logic_vector(1 downto 0);
begin
    process (clk) is 
    begin
        if clk = '1' and clk'event then
            sig1 (gen_indx) <= '1';
            for loop_indx in 0 to 1 loop
                local_sig(loop_indx) <= '1';
            end loop;
        end if; 
    end process;

    sig2(gen_indx*2+1 downto gen_indx*2)  <= local_sig;
end generate gen_label; 
gen_标签:对于0到3中的gen_indx生成
信号本地信号:标准逻辑向量(1到0);
开始
过程(clk)是
开始
如果clk='1'和clk'事件,则

sig1(gen_indx)这是因为,当在for循环内分配信号时,假设驱动器影响阵列(或记录)的所有元素。这是因为它不能在精化时计算出for循环的边界,因为它是一个运行时概念。这不同于在精化时可以推导边界的生成循环

因此,您需要从进程内部删除for循环,或者创建一个分配给外部sig2的generate循环的本地信号。例如:

gen_label : for gen_indx in 0 to 3 generate
  signal local_sig  : std_logic_vector(1 downto 0);
begin
    process (clk) is 
    begin
        if clk = '1' and clk'event then
            sig1 (gen_indx) <= '1';
            for loop_indx in 0 to 1 loop
                local_sig(loop_indx) <= '1';
            end loop;
        end if; 
    end process;

    sig2(gen_indx*2+1 downto gen_indx*2)  <= local_sig;
end generate gen_label; 
gen_标签:对于0到3中的gen_indx生成
信号本地信号:标准逻辑向量(1到0);
开始
过程(clk)是
开始
如果clk='1'和clk'事件,则

sig1(gen_indx)更精确的过程驱动因素在细化过程中确定(IEEE Std 1076-2008 14.2)。这可能涉及局部静态表达式、全局静态表达式,但最长的静态前缀(8.1)不包括动态细化的表达式(14.6动态细化第2“a”段使用for迭代方案执行循环语句…)。原始版本中最长的静态前缀是
sig2(gen_indx*2+loop_indx)
中的名称sig2,这里是
sig2(gen_indx*2+1下至gen_indx*2)
,它仅依赖于静态表达式。更精确的过程驱动程序在细化过程中被识别(IEEE Std 1076-2008 14.2)。这可能涉及局部静态表达式、全局静态表达式,但最长的静态前缀(8.1)不包括动态细化的表达式(14.6动态细化第2“a”段使用for迭代方案执行循环语句…)。原文中最长的静态前缀是
sig2(gen_indx*2+loop\u indx)
中的名称sig2,这里是
sig2(gen_indx*2+1下至gen_indx*2)
,它只依赖于静态表达式。这个问题没有答案,读者无法轻松复制问题,也无法验证任何答案。一个简单的解决方案是将循环语句替换为
sig2(gen_indx*2+1向下到gen_indx*2)'1')。问题是在细化设计层次结构期间用于识别驱动程序的最长静态前缀。循环参数是动态细化的,原始循环的最长静态前缀是sig2。@user1155120感谢您的通知。我对代码进行了编辑,使其可以立即验证。这个问题不会成为一个问题,让读者无法轻松地复制问题,也无法验证任何答案。一个简单的解决方案是将循环语句替换为
sig2(gen_indx*2+1向下到gen_indx*2)'1')。问题是在细化设计层次结构期间用于识别驱动程序的最长静态前缀。循环参数是动态细化的,原始循环的最长静态前缀是sig2。@user1155120感谢您的通知。我对代码进行了编辑,使其可以立即验证。