我是vhdl的新手,并且一项任务要求制作一个简单的16位ALU。这个ALU需要2个架构:行为,以及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
);
我基本上绝望地按时完成这件事。
感谢。
答案 0 :(得分: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
);
如果继续使用组件声明,则无需为每个模型创建单独的组件名称。您的配置规范将体系结构名称与实体相关联。
我建议您忘记配置规范,并针对更复杂的情况使用直接实体实例化的简单案例和配置声明。
答案 1 :(得分: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成为&#34; inout&#34;?你能说出来吗?对你来说可能会有点容易。