我有各种设计,在带有微控制器的并行总线上使用FPGA。对于每个设计,我都有一个测试平台,我使用模拟MCU时序的程序模拟总线上的几个读/写操作。
我想知道将这些过程放在一个包中以便于重用的好方法。现在,这些过程被定义并作用于测试平台实体范围内的信号。我宁愿有类似的东西。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.mcu_sim.all; -- contains MCU component and procedures for bus R/W operations
entity tb is
end tb;
architecture a of tb is
-- DUT
component fpga is
port (
clk, rst: in std_logic;
Data: inout std_logic_vector(7 downto 0);
Addr: in std_logic_vector(15 downto 0);
wr: in std_logic;
rd: in std_logic);
end component;
signal clk, rst: std_logic;
-- Bus signals
signal Data: std_logic_vector(7 downto 0);
signal Addr: std_logic_vector(15 downto 0);
signal rd: std_logic;
signal wr: std_logic;
begin
dut: fpga
port map (
clk => clk,
rst => rst,
Data => Data,
Addr => Addr,
wr => wr,
rd => rd
);
mcu1: mcu
port map (
clk => clk,
rst => rst,
Data => Data,
Addr => Addr,
wr => wr,
rd => rd
);
process
begin
clk <= '0';
wait for 0.5 us;
clk <= '1';
wait for 0.5 us;
end process;
stimulus: process
begin
rst <= '1', '0' after 1 us;
-- A list of nice, easy-to-read procedure calls to control the MCU
-- Defined in package mcu_sim: procedure buswrite(data: in std_logic_vector(7 downto 0); addr: in std_logic_vector(15 downto 0));
buswrite(X"01", X"0000"); -- Command for mcu to take control of bus and do a write operation to the fpga
buswrite(X"02", X"0001"); -- Command for mcu to take control of bus and do a write operation to the fpga
wait;
end process;
end a;
包mcu_sim将包含模拟MCU总线操作所需的一切,我可以使用过程调用轻松地计算我的刺激程序。我意识到需要程序来控制mcu1中发生的事情。有可能这样做吗?
如果没有,您将如何制定可重复使用的测试刺激程序?
答案 0 :(得分:3)
您可以将程序放入包中。但是,要做到这一点,您需要做两件事:
i)您必须将程序分为两部分。过程声明(包括名称,参数和返回类型)包含在包声明中。程序正文重复了子程序的声明并增加了子程序的实现,包含在一揽子计划中。
ii)您的程序必须具有完整的参数列表:参数列表必须包括程序读取的所有信号和变量以及由其分配的所有信号和变量。
package mcu_sim is
procedure buswrite(
data_in : in std_logic_vector(7 downto 0);
addr_in : in std_logic_vector(15 downto 0);
-- you will need to add all the MCU I/O here to give you a complete parameter list, eg
signal Data : out std_logic_vector(7 downto 0);
signal Addr : out std_logic_vector(15 downto 0);
signal rd : out std_logic;
signal wr : out std_logic
);
end package mcu_sim;
package body mcu_sim is
procedure buswrite(
data_in : in std_logic_vector(7 downto 0);
addr_in : in std_logic_vector(15 downto 0);
-- you will need to add all the MCU I/O here to give you a complete parameter list, eg
signal Data : out std_logic_vector(7 downto 0);
signal Addr : out std_logic_vector(15 downto 0);
signal rd : out std_logic;
signal wr : out std_logic
) is
begin
-- the code
end procedure buswrite;
end package body mcu_sim;
因此,您的刺激过程会变得像:
stimulus: process
begin
rst <= '1', '0' after 1 us;
buswrite(X"01", X"0000", Data, Addr, rd, wr);
buswrite(X"02", X"0001", Data, Addr, rd, wr);
wait;
end process;
答案 1 :(得分:2)
Matthew Taylor的答案基本上是如何打包程序的正确方法。
它的缺点是导致更混乱的测试平台,例如
buswrite(X"01", X"0000", Data, Addr, rd, wr);
buswrite(X"02", X"0001", Data, Addr, rd, wr);
当你想写一些更干净的东西时,比如
buswrite(X"01", X"0000");
buswrite(X"02", X"0001");
但不能,因为信号Data, Addr, rd, wr
不在包的范围内。
如果您记得VHDL允许基于参数和返回类型签名的运算符和子程序重载,您将看到您可以添加更简单的过程调用来调用打包的表单,而不会产生歧义。
在您的测试平台的声明区域(信号声明之后)或您的刺激过程声明区域中,所有这些信号都在范围内。
所以你可以在这些声明区域中编写一个简单的过程(取决于需要看多少个进程)
procedure buswrite(
data_in : in std_logic_vector(7 downto 0);
addr_in: in std_logic_vector(15 downto 0)) is
begin
buswrite( data_in, addr_in, Data, Addr, rd, wr);
end busWrite;
现在您可以保持测试平台代码清洁。