【问题标题】:test bench multiple architectures测试台多架构
【发布时间】:2013-09-23 19:18:20
【问题描述】:

对不起,我是这个网站的新手,但我已经连续搜索了将近 2 天的答案。

我是 vhdl 的新手,一个作业要求制作一个简单的 16 位 ALU。此 ALU 需要 2 个架构:行为设计和 RTL 设计。就我而言,我有完整的代码。

我想不通的是如何编写一个测试平台,让我可以在 modelsim 中运行两种架构的仿真。我有两个文件(测试台和 ALU)都编译得很好,但是我在模拟中遇到错误,说“未初始化的输入端口没有驱动程序”

我不确定要为这个问题显示什么代码,所以我只会向您展示我的 TB 的开头。

    LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY tb IS
END tb;

ARCHITECTURE behavior OF tb IS

   signal Clk,Res : std_logic := '0';
   signal A,B : signed(15 downto 0) := (others => '0');
   signal R1, R2 : signed(31 downto 0) := (others => '0');
   signal Op : unsigned(2 downto 0) := (others => '0');
   constant Clk_period : time := 10 ns;

component ALU_16_First
port(A, B: signed(15 downto 0):=(others => '0'); R: inout signed(31 downto 0):= (others => '0'); Op: in unsigned(2 downto 0) := (others => '0'); Clk, Res: Std_logic);
end component ALU_16_First;

component ALU_16_RTL
port(A, B: in signed(15 downto 0):= (others => '0');
     R: inout signed(31 downto 0):= (others => '0'); Op: in unsigned(2 downto 0) := (others => '0'); Clk, Res: Std_logic);
end component ALU_16_RTL;

for ALU_Behaviorial: ALU_16_First use entity work.simple_alu(Behavioral);
for ALU_RTL: ALU_16_RTL use entity work.simple_alu(RTL);

BEGIN

    -- Instantiate the Unit Under Test (UUT)

   ALU_Behaviorial : ALU_16_First  PORT MAP (
          A,
          B,
          R1,
          Op,
          Clk,
          Res
        );

    ALU_RTL: ALU_16_RTL PORT MAP (
          A,
          B,
          R2,
          Op,
          Clk,
          Res
        );

我基本上很想按时完成这项工作。

谢谢。

【问题讨论】:

    标签: vhdl modelsim intel-fpga alu


    【解决方案1】:

    它看起来不错,除了 R 端口是 inout (正如 Russell 指出的那样)。如果出于某种原因您需要 R 端口是双向的,请确保在测试平台中的适当时间将其分配给“Z”:

    testProc : process
    begin
      ...
      R <= (others => 'Z') ; 
    

    将来,您可以通过使用直接实体实例化代替组件声明、配置规范和组件实例化来节省一些时间:

     ALU_Behaviorial : use work.simple_alu(Behavioral)  
     PORT MAP (
          A => A_tb,
          B => B_tb,
          R => R1_tb,
          Op => Op_tb,
          Clk => Clk_tb,
          Res => Res_tb
        );
    

    如果您继续使用组件声明,则无需为每个模型创建单独的组件名称。将架构名称与实体相关联的是您的配置规范。

    我建议您忘记配置规范,对简单的情况使用直接实体实例化,对更复杂的情况使用配置声明。

    【讨论】:

    • 太棒了,我把端口改成了刚刚出来的。然后检查了非tb代码并更改了R获取数据的方式。我从那里想出了很多,谢谢!
    【解决方案2】:

    我建议使用显式端口映射来完全清楚您的组件实例化中发生了什么。比如:

       ALU_Behaviorial : ALU_16_First  PORT MAP (
          A => A_tb,
          B => B_tb,
          R1 => R1_tb,
          Op => Op_tb,
          Clk => Clk_tb,
          Res => Res_tb
        );
    

    _tb 信号是您的测试台信号。现在,确保您对组件(A_tb、B_tb、R1_tb、Op_tb、Clk_tb、Res_tb)的输入由您的测试台架构驱动。您的测试台在哪里驱动这些输入?

    另外,您选择将 R1 设为“inout”是否有充分的理由?你能把它弄出来吗?对你来说可能会容易一些。

    【讨论】:

    • 感谢您的快速回复。老实说,我想不出一个很好的理由来做一个 inout。我刚刚从教练那里拿了一个样本。在我的测试台中驱动的唯一信号是操作码,它会在每个时钟周期更新。
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2011-08-30
    • 2016-01-12
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    相关资源
    最近更新 更多