Мне нужно modelsim, чтобы посмотреть на внутренние переменные - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть VHDL-код с INs, OUTs и внутренними константами SIGNAL, такими как счетчики, которые я хочу смоделировать.Я просмотрел примеры в Интернете и вижу только Modelsim, контролирующий входы и выходы.Однако я также хотел бы взглянуть на внутренние сигналы, такие как счетчик.Я видел одного парня, пишущего только код симуляции.Мне нужен простой пример следующего: код с некоторыми входами и выходами и некоторыми внутренними сигналами.Простой универсальный код TB с приращением clk или аналогичным.Я видел пример, который выглядел правильно, но когда я адаптировал его к своему коду, внутренние сигналы были не определены в Modelsim.Я мог что-то упустить, но, насколько я понимаю, одной из важных особенностей Modelsim является написание общего тестового стенда с часами и его использование для просмотра гистограммы моей логики.По мере того, как ваш код прогрессирует, вам нужно только добавлять переменные по мере необходимости в ТБ.Если бы у кого-то был какой-то общий код или расположение кода как в оригинале, так и в tb, они бы поделились, было бы очень полезно.Спасибо

1 Ответ

0 голосов
/ 09 февраля 2019

У меня никогда не было проблем с получением моделей для отображения внутренних сигналов на осциллограммах.Я просто перетаскиваю сигнал из окна «Объекты» в окно «Волна».

enter image description here

Вот простой пример.Это TestModule.vhd:

library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.ALL;

entity TestModule is
port (
          ip_sl_ClkIn                : in std_logic;
          ip_slv_InputVal            : in std_logic_vector(7 downto 0);
          ip_sl_InputValid           : in std_logic;

          op_slv_OutputVal           : out std_logic_vector(7 downto 0);
          op_sl_OutputValid          : out std_logic
);
end TestModule;


architecture Behavioral of TestModule is

  --==========================
  --== INTERNAL SIGNALS
  --==========================
  signal s_slv_InputNibbleSwap_1d : std_logic_vector(7 downto 0) := (others => 'X');
  signal s_slv_Inverted_2d : std_logic_vector(7 downto 0) := (others => 'X');

  signal s_sl_InputValid_1d : std_logic := '0';
  signal s_sl_InputValid_2d : std_logic := '0';

begin


   RegisterProc : process(ip_sl_ClkIn)
    begin
      if(rising_edge(ip_sl_ClkIn)) then

      --Clock Cycle 1:
      --=======================
      --Take the input and swap nibble locations
      s_slv_InputNibbleSwap_1d <= ip_slv_InputVal(3 downto 0) & ip_slv_InputVal(7 downto 4);
      s_sl_InputValid_1d       <= ip_sl_InputValid;

      --Clock Cycle 2:
      --=======================          
      --Invert the bits
      s_slv_Inverted_2d        <= not(s_slv_InputNibbleSwap_1d);
      s_sl_InputValid_2d       <= s_sl_InputValid_1d;

      end if; --rising_edge(ip_sl_ClkIn)
    end process RegisterProc;



    --Route Outputs:
    --=====================
    op_slv_OutputVal  <= s_slv_Inverted_2d;
    op_sl_OutputValid <= s_sl_InputValid_2d;

end Behavioral;

Вот testbench, TestModule_tb.vhd:

 LIBRARY ieee;
  USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
  use std.textio.all;
ENTITY TestModule_tb IS
END TestModule_tb;

architecture behavior of TestModule_tb is

-- Component Declaration
-------------------------
  component TestModule
  Port ( 
        ip_sl_ClkIn : in std_logic;
        ip_slv_InputVal : in std_logic_vector ( 7 downto 0 );
        ip_sl_InputValid : in std_logic;
        op_slv_OutputVal : out std_logic_vector ( 7 downto 0 );
        op_sl_OutputValid : out std_logic
    );
  end component;



--Signals Driven by Entity: TestModule
-------------------------
    signal s_slv_OutputVal : std_logic_vector ( 7 downto 0 );
    signal s_sl_OutputValid : std_logic;


--Test Stimulus Signals:
-------------------------
    signal s_sl_ClkIn : std_logic;
    signal s_slv_InputVal : std_logic_vector ( 7 downto 0 );
    signal s_sl_InputValid : std_logic;


BEGIN

--Component Instantiation
    uut : TestModule
    Port Map (
        ip_sl_ClkIn         => s_sl_ClkIn   ,  --in std_logic
        ip_slv_InputVal     => s_slv_InputVal   ,  --in std_logic_vector ( 7 downto 0 )
        ip_sl_InputValid    => s_sl_InputValid   ,  --in std_logic
        op_slv_OutputVal    => s_slv_OutputVal   ,  --out std_logic_vector ( 7 downto 0 )
        op_sl_OutputValid   => s_sl_OutputValid     --out std_logic
    );


    clkProc : process
    begin
        s_sl_ClkIn <= '1';
        wait for 10 ns;
        s_sl_ClkIn <= '0';
        wait for 10 ns;
    end process;


MainTestProcess : Process
Begin

     s_slv_InputVal <= (others => '0');
     s_sl_InputValid <= '0';
     wait for 100 ns; 

     wait until rising_edge(s_sl_ClkIn); wait for 1 ps;
     s_slv_InputVal <= X"AB";
     s_sl_InputValid <= '1';

     wait until rising_edge(s_sl_ClkIn); wait for 1 ps;
     s_slv_InputVal <= X"FF";
     s_sl_InputValid <= '0';     

     wait for 100 ns;

    --Not a failure, but stops the simulation
    assert false report "<---- NOT a failure. Testbench Complete" severity failure;

    wait; -- Will wait forever
end process;

END;

Вот файл DO ModelSim для компиляции и моделирования, TestModule_tb.do:

vlib work
vcom -reportprogress 300 -work work TestModule.vhd
vcom -reportprogress 300 -work work TestModule_tb.vhd 
vsim -gui work.testmodule_tb
do TestModule_tb_wave.do
run -all

А вот файл DO модели волны, TestModule_tb_wave.do:

onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate /testmodule_tb/uut/ip_sl_ClkIn
add wave -noupdate /testmodule_tb/uut/ip_slv_InputVal
add wave -noupdate /testmodule_tb/uut/ip_sl_InputValid
add wave -noupdate /testmodule_tb/uut/op_slv_OutputVal
add wave -noupdate /testmodule_tb/uut/op_sl_OutputValid
add wave -noupdate /testmodule_tb/uut/s_slv_InputNibbleSwap_1d
add wave -noupdate /testmodule_tb/uut/s_slv_Inverted_2d
add wave -noupdate /testmodule_tb/uut/s_sl_InputValid_1d
add wave -noupdate /testmodule_tb/uut/s_sl_InputValid_2d
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {{Cursor 1} {90738 ps} 0}
quietly wave cursor active 1
configure wave -namecolwidth 331
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
configure wave -gridoffset 0
configure wave -gridperiod 1
configure wave -griddelta 40
configure wave -timeline 0
configure wave -timelineunits ps
update
WaveRestoreZoom {0 ps} {231001 ps}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...