Vhdl 多体系结构测试台

Vhdl 多体系结构测试台,vhdl,modelsim,intel-fpga,alu,Vhdl,Modelsim,Intel Fpga,Alu,对不起,我是这个网站的新手,但我已经连续两天在搜索答案了 我是vhdl新手,一项作业要求制作一个简单的16位ALU。该ALU需要两种架构:行为架构和RTL设计。就我而言,我有完整的代码 我无法理解的是如何编写一个测试台,使我能够在modelsim中为这两种体系结构运行模拟。我有两个文件(测试台和ALU),它们编译得很好,但是我在模拟中得到错误,说“未初始化的inout端口没有驱动程序” 我不确定要为这个问题显示什么代码,所以我将只显示TB的开头 LIBRARY ieee; USE iee

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

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

我无法理解的是如何编写一个测试台,使我能够在modelsim中为这两种体系结构运行模拟。我有两个文件(测试台和ALU),它们编译得很好,但是我在模拟中得到错误,说“未初始化的inout端口没有驱动程序”

我不确定要为这个问题显示什么代码,所以我将只显示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
        );
我基本上非常渴望按时完成这件事


谢谢。

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

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

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

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

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

testProc : process
begin
  ...
  R <= (others => 'Z') ; 
如果继续使用组件声明,则无需为每个模型创建单独的组件名称。将体系结构名称与实体关联的是您的配置规范


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

除了输入的R端口(如Russell所述)之外,它看起来还不错。如果出于某种原因,您需要R端口是双向的,请确保在测试台的适当时间将其分配给“Z”:

testProc : process
begin
  ...
  R <= (others => 'Z') ; 
如果继续使用组件声明,则无需为每个模型创建单独的组件名称。将体系结构名称与实体关联的是您的配置规范


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

感谢您的快速回复。老实说,我想不出有什么好的理由可以在inout中使用。我刚从老师那里取了一个样本。我的测试台上唯一驱动的信号是op代码,它会更新每个时钟周期。感谢您的快速回复。老实说,我想不出有什么好的理由可以在inout中使用。我刚从老师那里取了一个样本。在我的测试台上唯一驱动的信号是op代码,它会更新每个时钟周期。太棒了,我把端口改为just out。然后检查非tb代码并更改R获取数据的方式。我从那里了解了很多,谢谢!太棒了,我把端口改成了刚出。然后检查非tb代码并更改R获取数据的方式。我从那里了解了很多,谢谢!