1

抱歉,我是这个网站的新手,但我已经连续 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
        );

我基本上不顾一切地按时完成这项工作。

谢谢。

4

2 回答 2

1

除了 R 端口在输出之外,它看起来还不错(正如 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
    );

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

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

于 2013-09-23T20:59:17.833 回答
0

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

   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”是否有充分的理由?你能把它弄出来吗?对你来说可能会容易一些。

于 2013-09-23T19:46:52.827 回答