generics - 在文件之间共享(包括?)VHDL 中的泛型?

标签 generics include share vhdl

假设我有一个带有泛型的简单核心 genertest.vhd :

--------------------------------------------------------------------------
library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  -- use IEEE.STD_LOGIC_ARITH.ALL;
  -- use IEEE.STD_LOGIC_UNSIGNED.ALL;
  use IEEE.NUMERIC_STD.ALL;


ENTITY genertest IS
  GENERIC(
    numbits : natural := 8
  );
  PORT
  (
    clk   :  IN STD_LOGIC;
    d_OUT : OUT STD_LOGIC_VECTOR(numbits-1 downto 0);
    d_IN  :  IN STD_LOGIC_VECTOR(numbits-1 downto 0)
  );
END genertest;


ARCHITECTURE structure OF genertest IS
BEGIN

  main_proc: PROCESS(clk)
  BEGIN
    IF rising_edge(clk) THEN -- posedge
      d_OUT <= not(d_IN);
    END IF;
  END PROCESS main_proc;

END structure;

...我想使用以下测试工作台对其进行测试,genertest_twb.vhd :
----------------------------------------------------------------------------------

library IEEE;
  use IEEE.STD_LOGIC_1164.ALL;
  -- use IEEE.STD_LOGIC_ARITH.ALL;
  -- use IEEE.STD_LOGIC_UNSIGNED.ALL;
  use IEEE.NUMERIC_STD.ALL;

ENTITY genertest_twb IS
END genertest_twb;

ARCHITECTURE testbench_arch OF genertest_twb IS

  COMPONENT genertest
    PORT(
      clk   :  IN STD_LOGIC;
      d_OUT : OUT STD_LOGIC_VECTOR(numbits-1 downto 0);
      d_IN  :  IN STD_LOGIC_VECTOR(numbits-1 downto 0)
    );
  END COMPONENT;

  SIGNAL wtCLK : std_logic := '0';
  SIGNAL wCntReg : STD_LOGIC_VECTOR(numbits-1 DOWNTO 0) := (others => 'Z');
  SIGNAL tmp_cnt : natural := 0 ;

  -- clock parameters
  constant PERIODN : natural := 20; -- can be real := 20.0;
  constant PERIOD : time := PERIODN * 1 ns;
  constant DUTY_CYCLE : real := 0.5;
  constant OFFSET : time := 100 ns;

BEGIN

  UUT : genertest -- VHDL
  PORT MAP(
    clk => wtCLK,
    d_IN => wCntReg,
    d_OUT => OPEN
  );

  -- clock process for generating CLK
  -- (here, left as unnamed)
  PROCESS
  BEGIN

    WAIT for OFFSET;

    CLOCK_LOOP : LOOP
      wtCLK <= '0';
      -- tmp_na - natural problems with bit width?
      -- wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_na), wCntReg'length));
      WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
      wtCLK <= '1';
      WAIT FOR (PERIOD * DUTY_CYCLE);
    END LOOP CLOCK_LOOP;
  END PROCESS;


  count_proc: PROCESS(wtCLK)
  BEGIN
    IF rising_edge(wtCLK) THEN -- posedge
      tmp_cnt <= tmp_cnt + 1;
      wCntReg <= std_logic_vector(to_unsigned(natural'pos(tmp_cnt), wCntReg'length));
    END IF;
  END PROCESS count_proc;


END testbench_arch;

现在,我假设通过引用 genertest组件,工作台会自动知道 numbits通用,但不幸的是,情况并非如此; ISE WebPack 中上述工作台的行为模拟失败:
ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 17: <numbits> is not declared.
ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 18: <numbits> is not declared.
ERROR:HDLCompiler:69 - "/genertest_tbw.vhd" Line 23: <numbits> is not declared.

通过在 genertest_tbw.vhd 中添加通用部分这里:
  COMPONENT genertest
    GENERIC(
      numbits : natural := 8
    );
    PORT(
      ...

... 将修复组件本地的泛型引用 - 不幸的是,对 SIGNAL wCntReg 中的泛型的引用声明仍然会失败。

最后,在genertest_tbw.vhd中添加通用部分这里:
ENTITY genertest_twb IS
  GENERIC(
    numbits : natural := 8
  );
END genertest_twb;

... 使泛型可用于整个工作台文件。

但是,这仍然意味着我必须手动复制/粘贴 numbits : natural := 8工作台文件中的句子也是如此;这意味着它将计算两个位置,如果我想更改通用值,我必须同时更改两个位置:(

所以我的问题是 - 有没有办法共享/包含泛型,以便它们仅在一个文件中写入/定义 - 而其他文件可以引用这些特定值?

提前感谢您的任何答案,
干杯!

最佳答案

你错过了泛型的重点。您不会通过层次结构向上传递通用值,而是将它们向下传递。

在您的测试平台中定义 numbits(也许作为更有意义的东西,例如 RAM_WIDTH),并使用它来实例化具有适当位数的genertest。在您的genertest 实体中为 numbits 定义的默认值用于未明确定义通用值的代码(为了可读性,或者可能是为了保持过去总是采用 8 位的函数的向后兼容性,但现在可以配置为任何宽度)。

所以在你的测试平台中,你想要这样的东西:

constant RAM_WIDTH : integer := 8;
...
UUT : genertest 
  GENERIC MAP (
    numbits => RAM_WIDTH
  );
  PORT MAP
  (
    clk   => wtCLK,
...

关于generics - 在文件之间共享(包括?)VHDL 中的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701572/

相关文章:

java - 将对象添加到 ArrayList

Java 将对象的实例类型传递给泛型类类型参数

javascript - 你能把 'compile' html文件放在一起来模拟 'include'函数吗?

javascript - 如何将官方的 google +1 和 facebook 的 like/share 按钮放在同一行?

oop - 为什么协议(protocol)的关联类型在 Swift 中不使用泛型语法?

java - 存储某类JAVA子类的哈希集

c++ - 通过函数传递 ifstream 文件时出错

c++ - 在构建我的 C++ 可执行文件 (gcc) 时,我可以获得所有链接库的报告吗? (包括静态链接)

android - 获取能够处理 SEND Intent 以在 View 中显示的应用程序列表(不是弹出对话框)

LinkedIn 问题分享 : Remove your attachment to post from another account