Vhdl Vivado 2016.3带有无约束标准逻辑向量的无约束记录数组

Vhdl Vivado 2016.3带有无约束标准逻辑向量的无约束记录数组,vhdl,fpga,xilinx,vivado,Vhdl,Fpga,Xilinx,Vivado,我正在试验在Vivado 2016.3中合成一些VHDL 2008代码(2016.4中也是如此) 其思想是能够在记录中拥有无约束数组,同时拥有这些记录的无约束数组 相关代码: (axi_pkg.vhd) 最后测试基本上限制合成尺寸的_entity_top.vhd: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.axi_pkg.all; entity test_entity_top is

我正在试验在Vivado 2016.3中合成一些VHDL 2008代码(2016.4中也是如此)

其思想是能够在记录中拥有无约束数组,同时拥有这些记录的无约束数组

相关代码:

(axi_pkg.vhd)

最后测试基本上限制合成尺寸的_entity_top.vhd:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.axi_pkg.all;

entity test_entity_top is
end entity;

architecture test of test_entity_top is
    constant SIZE   : natural := 10;
    constant DATA_W : natural := 16;
    signal test_axis_in : axis_in(tdata(DATA_W-1 downto 0),
                                  tuser(DATA_W/8-1 downto 0));
    signal test_axis_out : axis_out;
    signal in_axis_in : axis_in_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                        tuser(DATA_W/8-1 downto 0));
    signal in_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal out_axis_in : axis_in_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                         tuser(DATA_W/8-1 downto 0));
    signal out_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal aresetn      : std_logic;
    signal aclk         : std_logic;
begin

    tst : entity work.test_entity
        port map (aresetn      => aresetn,
                  aclk         => aclk,
                  in_axis_in   => in_axis_in,
                  in_axis_out  => in_axis_out,
                  out_axis_in  => out_axis_in,
                  out_axis_out => out_axis_out
                  );
end architecture;
所有这些都可以在ModelSim中很好地编译。但是Vivado不愿意把它合成。。。出现此错误时:

ERROR: [Synth 8-2190] illegal syntax for subtype indication [/home/bkremel/test_vivado/test_entity_top.vhd:15]
ERROR: [Synth 8-2235] indexed name prefix type axis_in_vector expects 1 dimensions [/home/bkremel/test_vivado/test_entity_top.vhd:15]
ERROR: [Synth 8-2190] illegal syntax for subtype indication [/home/bkremel/test_vivado/test_entity_top.vhd:18]
ERROR: [Synth 8-2235] indexed name prefix type axis_in_vector expects 1 dimensions [/home/bkremel/test_vivado/test_entity_top.vhd:18]
ERROR: [Synth 8-1031] in_axis_in is not declared [/home/bkremel/test_vivado/test_entity_top.vhd:28]
ERROR: [Synth 8-1031] out_axis_in is not declared [/home/bkremel/test_vivado/test_entity_top.vhd:30]
ERROR: [Synth 8-1568] actual of formal out port out_axis_in cannot be an expression [/home/bkremel/test_vivado/test_entity_top.vhd:30]
INFO: [Synth 8-2810] unit test ignored due to previous errors [/home/bkremel/test_vivado/test_entity_top.vhd:9]
这表明它实际上接受记录约束的语法:

signal test_axis_in : axis_in(tdata(DATA_W-1 downto 0),
                              tuser(DATA_W/8-1 downto 0));
虽然它不喜欢:

signal in_axis_in : axis_in_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                tuser(DATA_W/8-1 downto 0));
您建议如何使用无约束数组和记录的intead

问题是我的设计经常改变流的位大小。。因此,使用通用包将非常不雅观(特别是当在一个文件中有不同大小的数据总线时,这个寄存器是一个很好的例子)

到目前为止,我使用了一维slv,没有记录,并使用函数/过程进行手动索引,但维护起来相当混乱

我还添加了相关代码的示例(以证明它在模拟器中工作)

编辑:

有趣的是,如果我这样做,它实际上是合成的:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.axi_pkg.all;

entity test_entity_top is
end entity;

architecture test of test_entity_top is
    constant SIZE   : natural := 4;
    constant DATA_W : natural := 16;
    subtype axis_in_constr is axis_in(tdata(DATA_W-1 downto 0),
                                      tuser(DATA_W/8-1 downto 0));
    subtype axis_out_constr is axis_out;

    signal ch0, ch1, ch2, ch3 : axis_in_constr;
    signal out0, out1, out2, out3 : axis_in_constr;
    signal in_axis_in : axis_in_vector := (ch0, ch1, ch2, ch3);
    signal out_axis_in : axis_in_vector := (out0, out1, out2, out3);
    signal in_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal out_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal aresetn      : std_logic;
    signal aclk         : std_logic;
begin

    tst : entity work.test_entity
        port map (aresetn      => aresetn,
                  aclk         => aclk,
                  in_axis_in   => in_axis_in,
                  in_axis_out  => in_axis_out,
                  out_axis_in  => out_axis_in,
                  out_axis_out => out_axis_out
                  );
end architecture;
这意味着实际上支持带有无约束数组的记录数组,但不支持直接约束语法

有没有办法不那么细致地定义它?虽然像这样定义顶级并不是什么大不了的事。。但我还是不介意避开它,它看起来有点黑

谢谢
Bruno

与Xilinx SR一起,我们已经找到了理想行为的工作示例,因此我将其发布在这里,因为它在Vivado以及ModelSim/EdaPlayed中都能工作

-- axi_pkg.vhd
-- Author: Bruno Kremel (CERN BE-RF-FB)
-- Date: 2016-01-23
-- Description: AXI4 Package

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package axi_pkg is
    type axis_downstream is record
        tdata  : std_logic_vector;
        tvalid : std_logic;
        tlast  : std_logic;
        tuser  : std_logic_vector;
    end record;

    type axis_upstream is record
        tready : std_logic;
    end record;

    type axis_downstream_vector is array (natural range <>) of axis_downstream;
    type axis_upstream_vector is array (natural range <>) of axis_upstream;
end package;


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.axi_pkg.all;

entity test_entity_top is
end entity;

architecture test of test_entity_top is
    constant SIZE   : natural := 4;
    constant DATA_W : natural := 16;

    signal axis_downstream : axis_downstream_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                                     tuser(DATA_W/8-1 downto 0));
    signal axis_upstream : axis_upstream_vector(SIZE-1 downto 0);
begin
    assert axis_downstream'length = SIZE
        report "SIZE is not correct"
    severity failure;

    assert axis_downstream(0).tdata'length = DATA_W
        report "TDATA width is not correct"
    severity failure;

    assert axis_downstream(0).tuser'length = (DATA_W/8)
        report "TUSER width is not correct"
    severity failure;

end architecture;
--axi_pkg.vhd
--作者:Bruno Kremel(CERN BE-RF-FB)
--日期:2016-01-23
--说明:AXI4软件包
图书馆ieee;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
axi_包装为
类型轴_下游为记录
tdata:std_逻辑_向量;
tvalid:std_逻辑;
tlast:std_逻辑;
tuser:std_逻辑_向量;
结束记录;
上游轴的类型为记录
tready:标准逻辑;
结束记录;
类型axis_down_向量是axis_down的数组(自然范围);
类型axis_upstream_vector是axis_upstream的数组(自然范围);
端包装;
图书馆ieee;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用work.axi_pkg.all;
实体测试\u实体\u顶部为
终端实体;
测试实体的架构测试是
恒定尺寸:自然尺寸:=4;
常数数据W:自然值:=16;
信号轴_下游:轴_下游_矢量(大小-1向下至0)(tdata(数据_W-1向下至0),
tuser(数据从8-1降到0);
信号轴_上游:轴_上游_矢量(大小-1向下至0);
开始
断言轴_下游长度=尺寸
报告“大小不正确”
严重故障;
断言下游轴(0).tdata'length=DATA\u W
报告“TDATA宽度不正确”
严重故障;
断言下游轴(0)。t长度=(数据W/8)
报告“t接收器宽度不正确”
严重故障;
终端架构;
问题是并非所有文件都在Vivado中标记为2008(我的错)。但是我发布了这个最小的例子,以便它很好地符合这个问题。
还有一个链接:

不确定崩溃情况,但它看起来像是您的
输入轴\u输入
输出轴\u输入
端口应该具有类型
轴\u输入向量
而不是
轴\u输入
。或者删除这些端口上的范围限制。是。它包含错误。首先模拟它并修复它们。从缺少的library/use子句开始,然后是包中缺少的约束。编译包:`ghdl-a axi_pkg.vhd axi_pkg.vhd:6:9:不允许使用无约束数组类型“std_logic_vector”的元素声明`第一个问题非常清楚。Hi Bruno,正如其他人所说,有一些错误需要修复。我不喜欢记录中不受约束的领域,但在2008年它似乎是合法的(我学到了一些东西)。不过,使用起来有点麻烦:。下一个问题是试图使
tuser
字段的宽度相同。我想不出你会怎么做。我想知道通用软件包是否是一种更好的方法,假设你能综合它们。我已经用你的建议纠正了我的问题。现在,它完全不受约束,可以说相当优雅。。它在ModelSim中工作,如原始问题中所述。。。但Vivado似乎无论如何都拒绝了@BrianDrummond记录中的无约束数组是2008年的特征。。。根据Vivado文档,这应该得到支持…事实上,为VHDL-2008编译消除了无约束向量错误,我道歉。但是离开axi_pkg.vhd:9:41:前缀必须表示数组对象或类型,其中前缀是
tdata
。这是一个数组,但我不确定它在
结束记录之前是否可见,端口列表中的类似用法将不会出现。如果VHDL在从Ada简化时没有放弃区分记录,这将是微不足道的。。。
signal in_axis_in : axis_in_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                tuser(DATA_W/8-1 downto 0));
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.axi_pkg.all;

entity test_entity_top is
end entity;

architecture test of test_entity_top is
    constant SIZE   : natural := 4;
    constant DATA_W : natural := 16;
    subtype axis_in_constr is axis_in(tdata(DATA_W-1 downto 0),
                                      tuser(DATA_W/8-1 downto 0));
    subtype axis_out_constr is axis_out;

    signal ch0, ch1, ch2, ch3 : axis_in_constr;
    signal out0, out1, out2, out3 : axis_in_constr;
    signal in_axis_in : axis_in_vector := (ch0, ch1, ch2, ch3);
    signal out_axis_in : axis_in_vector := (out0, out1, out2, out3);
    signal in_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal out_axis_out : axis_out_vector(SIZE-1 downto 0);
    signal aresetn      : std_logic;
    signal aclk         : std_logic;
begin

    tst : entity work.test_entity
        port map (aresetn      => aresetn,
                  aclk         => aclk,
                  in_axis_in   => in_axis_in,
                  in_axis_out  => in_axis_out,
                  out_axis_in  => out_axis_in,
                  out_axis_out => out_axis_out
                  );
end architecture;
-- axi_pkg.vhd
-- Author: Bruno Kremel (CERN BE-RF-FB)
-- Date: 2016-01-23
-- Description: AXI4 Package

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package axi_pkg is
    type axis_downstream is record
        tdata  : std_logic_vector;
        tvalid : std_logic;
        tlast  : std_logic;
        tuser  : std_logic_vector;
    end record;

    type axis_upstream is record
        tready : std_logic;
    end record;

    type axis_downstream_vector is array (natural range <>) of axis_downstream;
    type axis_upstream_vector is array (natural range <>) of axis_upstream;
end package;


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.axi_pkg.all;

entity test_entity_top is
end entity;

architecture test of test_entity_top is
    constant SIZE   : natural := 4;
    constant DATA_W : natural := 16;

    signal axis_downstream : axis_downstream_vector(SIZE-1 downto 0)(tdata(DATA_W-1 downto 0),
                                                                     tuser(DATA_W/8-1 downto 0));
    signal axis_upstream : axis_upstream_vector(SIZE-1 downto 0);
begin
    assert axis_downstream'length = SIZE
        report "SIZE is not correct"
    severity failure;

    assert axis_downstream(0).tdata'length = DATA_W
        report "TDATA width is not correct"
    severity failure;

    assert axis_downstream(0).tuser'length = (DATA_W/8)
        report "TUSER width is not correct"
    severity failure;

end architecture;