2016-10-18 4 views
0

У меня есть различные конструкции, которые используют ПЛИС на параллельной шине с микроконтроллером. Для каждой конструкции у меня есть testbench, я имитирую несколько операций чтения/записи на шине, используя процедуры, которые эмулируют синхронизацию MCU.Процедура обработки пакетов для стимула testbench

Я хотел бы знать, как можно использовать эти процедуры в пакете для более простого повторного использования. В настоящее время процедуры определены и действуют на сигналы в рамках объекта testbench. Я бы предпочел что-то подобное.

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. Можно ли сделать это?

Если нет, как бы вы делали многоразовые процедуры для тестовых стимулов?

ответ

1

Вы можете поместить процедуры в пакет. Однако для этого вам необходимо сделать две вещи:

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; 
+0

У этой проблемы: 'data' и' Data' образуют конфликт имен, потому что VHDL не чувствителен к регистру, благодаря своим корням, возвращаясь к тому времени, прежде чем вы могли предположить, что в нижнем регистре было доступно. (А также потому, что полагаться на чувствительность к регистру, чтобы дифференцировать имена, просто ПРОСЬБА для путаницы!) –

+0

Так оно и есть! Я изменю имена. –

+0

Вау, это первый раз, когда я задал здесь вопрос, впечатленный быстрыми и хорошими ответами от вас обоих! Это был непростой призыв, но Мэтью получил очки за правильный ответ, поскольку он был ближе всего к тому, что я хотел для конечного результата. Я также дал вам оба показателя. – Lasse

1

Мэтью Тейлор является по существу правильный подход о том, как упаковать процедуры.

Это имеет тот недостаток, что приводит к более суматоху тестбенча, такие как

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 
    bus_write(data_in, addr_in, Data, Addr, rd, wr); 
end busWrite; 

и теперь вы можете сохранить ваш код TestBench в чистоте.

 Смежные вопросы

  • Нет связанных вопросов^_^