Sida 1 av 1

Kommandot force i modelsim.

Postat: 16 september 2007, 15:50:45
av Kango
Hej, är ny här på forumet och passar på att fråga en sak gällande programmet modelsim.

Jag har skrivit en VHDL-kod och vill gärna se hur utsignalerna ser ut genom att simulera min kod. Dock händer det inte så mycket med utsignalerna efter att jag har simulerat koden. Jag har läst lite om något som kallas "force kommandon" och undrar lite om hur man kan använda dessa på ett "effektivt" sätt.

Postat: 16 september 2007, 16:21:37
av rehnmaak
Bästa sättet är att skriva en testbänk där du instansierar din kod och driver insignalerna från testbänken.

Dock har jag använt force-kommandot någon gång men då har jag bara skapat en klocka med hjälp av det kommanot.

Postat: 16 september 2007, 16:43:40
av Kango
Trevligt med respons.

Jag sökte på google efter det du sa om "testbänken", det verkar dock vara mer arbete att utföra, men det är väl så man skall göra antar jag. Men det är alltså inte omöjligt att få till det med force kommandon?

Om jag läger upp min VHDL-kod, kan du ge exempel på hur jag skall göra angående testbänken?

Postat: 16 september 2007, 17:00:03
av rehnmaak
Om du kör Xilinx ISE kan du få den att gerera en mall som man sedan fyller på. Här är ett exempel:

Kod: Markera allt


--------------------------------------------------------------------------------
-- Company: 
-- Engineer:
--
-- Create Date:   21:38:01 09/22/2006
-- Design Name:   cioio_core
-- Module Name:   tb_cioio_core.vhd
-- Project Name:  opb_cioio
-- Target Device:  
-- Tool versions:  
-- Description:   
-- 
-- VHDL Test Bench Created by ISE for module: cioio_core
--
-- Dependencies:
-- 
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
-- Notes: 
-- This testbench has been automatically generated using types std_logic and
-- std_logic_vector for the ports of the unit under test.  Xilinx recommends 
-- that these types always be used for the top-level I/O of a design in order 
-- to guarantee that the testbench will bind correctly to the post-implementation 
-- simulation model.
--------------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY tb_cioio_core_vhd IS
END tb_cioio_core_vhd;

ARCHITECTURE behavior OF tb_cioio_core_vhd IS 

	-- Component Declaration for the Unit Under Test (UUT)
	COMPONENT cioio_core
	PORT(
		ddi : IN std_logic;
		Bus2IP_Clk : IN std_logic;
		Bus2IP_Reset : IN std_logic;
		Bus2IP_Data : IN std_logic_vector(0 to 31);
		Bus2IP_BE : IN std_logic_vector(0 to 3);
		Bus2IP_RdCE : IN std_logic_vector(0 to 1);
		Bus2IP_WrCE : IN std_logic_vector(0 to 1);          
		dsck : OUT std_logic;
		ddo : OUT std_logic;
		dupdate : OUT std_logic;
		IP2Bus_Data : OUT std_logic_vector(0 to 31);
		IP2Bus_Ack : OUT std_logic;
		IP2Bus_Retry : OUT std_logic;
		IP2Bus_Error : OUT std_logic;
		IP2Bus_ToutSup : OUT std_logic
		);
	END COMPONENT;
	
COMPONENT cioio is
    Port ( dsck : in  STD_LOGIC;
           ddi : in  STD_LOGIC;
           dupdate : in  STD_LOGIC;
           ddo : out  STD_LOGIC;
			  onpress : in STD_LOGIC;
			  offpress : in STD_LOGIC;
			  interlock : in STD_LOGIC;
			  ind5v : in STD_LOGIC;
			  overvoltage : in STD_LOGIC;
			  ovpind : in STD_LOGIC;
           measvgnd : out  STD_LOGIC;
           sout : out  STD_LOGIC;
           soutgndp : out  STD_LOGIC;
           soutgndn : out  STD_LOGIC;
           swon : out  STD_LOGIC;
           ovpon : out  STD_LOGIC;
           sdiv : out  STD_LOGIC;
           ampen : out  STD_LOGIC;
           sampgnd : out  STD_LOGIC;
           samp : out  STD_LOGIC;
           selectout0 : out  STD_LOGIC;
           selectout1 : out  STD_LOGIC;
           selectgenout : out  STD_LOGIC;
           selectgengen : out  STD_LOGIC;
           selectgen0 : out  STD_LOGIC;
           selectgen1 : out  STD_LOGIC;
           testovp : out  STD_LOGIC;
           led0 : out  STD_LOGIC;
           led1 : out  STD_LOGIC;
           led2 : out  STD_LOGIC;
           led3 : out  STD_LOGIC;
           led4 : out  STD_LOGIC;
           led5 : out  STD_LOGIC;
           led6 : out  STD_LOGIC;
           led7 : out  STD_LOGIC;
           led8 : out  STD_LOGIC;
           led9 : out  STD_LOGIC
			  );
end COMPONENT;
	

	--Inputs
	SIGNAL ddi :  std_logic := '0';
	SIGNAL Bus2IP_Clk :  std_logic := '0';
	SIGNAL Bus2IP_Reset :  std_logic := '0';
	SIGNAL Bus2IP_Data :  std_logic_vector(0 to 31) := (others=>'0');
	SIGNAL Bus2IP_BE :  std_logic_vector(0 to 3) := (others=>'0');
	SIGNAL Bus2IP_RdCE :  std_logic_vector(0 to 1) := (others=>'0');
	SIGNAL Bus2IP_WrCE :  std_logic_vector(0 to 1) := (others=>'0');

	SIGNAL onpress : std_logic := '1';
	SIGNAL offpress : std_logic := '0';
	SIGNAL interlock : std_logic := '0';
	SIGNAL ind5v : std_logic := '0';
	SIGNAL overvoltage : std_logic := '0';
	SIGNAL ovpind : std_logic := '0';

	--Outputs
	SIGNAL dsck :  std_logic;
	SIGNAL ddo :  std_logic;
	SIGNAL dupdate :  std_logic;
	SIGNAL IP2Bus_Data :  std_logic_vector(0 to 31);
	SIGNAL IP2Bus_Ack :  std_logic;
	SIGNAL IP2Bus_Retry :  std_logic;
	SIGNAL IP2Bus_Error :  std_logic;
	SIGNAL IP2Bus_ToutSup :  std_logic;

	SIGNAL measvgnd :  std_logic;
	SIGNAL sout :  std_logic;
	SIGNAL soutgndp :  std_logic;
	SIGNAL soutgndn :  std_logic;
	SIGNAL swon :  std_logic;
	SIGNAL ovpon :  std_logic;
	SIGNAL sdiv :  std_logic;
	SIGNAL ampen :  std_logic;
	SIGNAL sampgnd :  std_logic;
	SIGNAL samp :  std_logic;
	SIGNAL selectout0 :  std_logic;
	SIGNAL selectout1 :  std_logic;
	SIGNAL selectgenout :  std_logic;
	SIGNAL selectgengen :  std_logic;
	SIGNAL selectgen0 :  std_logic;
	SIGNAL selectgen1 :  std_logic;
	SIGNAL testovp :  std_logic;
	SIGNAL led0 :  std_logic;
	SIGNAL led1 :  std_logic;
	SIGNAL led2 :  std_logic;
	SIGNAL led3 :  std_logic;
	SIGNAL led4 :  std_logic;
	SIGNAL led5 :  std_logic;
	SIGNAL led6 :  std_logic;
	SIGNAL led7 :  std_logic;
	SIGNAL led8 :  std_logic;
	SIGNAL led9 :  std_logic;


BEGIN

	-- Instantiate the Unit Under Test (UUT)
	uut: cioio_core PORT MAP(
		dsck => dsck,
		ddo => ddo,
		dupdate => dupdate,
		ddi => ddi,
		Bus2IP_Clk => Bus2IP_Clk,
		Bus2IP_Reset => Bus2IP_Reset,
		Bus2IP_Data => Bus2IP_Data,
		Bus2IP_BE => Bus2IP_BE,
		Bus2IP_RdCE => Bus2IP_RdCE,
		Bus2IP_WrCE => Bus2IP_WrCE,
		IP2Bus_Data => IP2Bus_Data,
		IP2Bus_Ack => IP2Bus_Ack,
		IP2Bus_Retry => IP2Bus_Retry,
		IP2Bus_Error => IP2Bus_Error,
		IP2Bus_ToutSup => IP2Bus_ToutSup
	);

	cioiox: cioio PORT MAP(
	        dsck => dsck,
           ddi => ddo,
           dupdate => dupdate,
           ddo => ddi,
			  onpress => onpress,
			  offpress => offpress,
			  interlock => interlock,
			  ind5v => ind5v,
			  overvoltage => overvoltage,
			  ovpind => ovpind,
           measvgnd => measvgnd,
           sout => sout,
           soutgndp => soutgndp,
           soutgndn => soutgndn,
           swon => swon,
           ovpon => ovpon,
           sdiv => sdiv,
           ampen => ampen,
           sampgnd => sampgnd,
           samp => samp,
           selectout0 => selectout0,
           selectout1 => selectout1,
           selectgenout => selectgenout,
           selectgengen => selectgengen,
           selectgen0 => selectgen0,
           selectgen1 => selectgen1,
           testovp => testovp,
           led0 => led0,
           led1 => led1,
           led2 => led2,
           led3 => led3,
           led4 => led4,
           led5 => led5,
           led6 => led6,
           led7 => led7,
           led8 => led8,
           led9 => led9
	);

	tb1: process
	begin
		Bus2IP_Clk <= '0';
		wait for 10 ns;
		Bus2IP_Clk <= '1';
		wait for 10 ns;
	end process;

	tb : PROCESS
	BEGIN

		-- Wait 100 ns for global reset to finish
		wait for 100 ns;
		Bus2IP_Reset <= '1';
		wait for 100 ns;
		Bus2IP_Reset <= '0';
		
		Bus2IP_Data <= X"00000001";
		Bus2IP_BE <= B"1111";
		Bus2IP_RdCE <= B"00";
		Bus2IP_WrCE <= B"10";

		wait for 100 ns;
		Bus2IP_Data <= X"00000000";
		Bus2IP_BE <= B"0000";
		Bus2IP_RdCE <= B"00";
		Bus2IP_WrCE <= B"00";

		wait for 100 ns;
		Bus2IP_Data <= (others=>'U');
		Bus2IP_BE <= B"1111";
		Bus2IP_RdCE <= B"10";
		Bus2IP_WrCE <= B"00";
		
		wait until IP2Bus_Data(31)='0';
		wait for 100 ns;
		Bus2IP_Data <= (others=>'U');
		Bus2IP_BE <= B"0000";
		Bus2IP_RdCE <= B"00";
		Bus2IP_WrCE <= B"00";

		wait for 100 ns;
		Bus2IP_Data <= (others=>'U');
		Bus2IP_BE <= B"1111";
		Bus2IP_RdCE <= B"01";
		Bus2IP_WrCE <= B"00";
		
		wait; -- will wait forever
	END PROCESS;

END;


Postat: 16 september 2007, 17:10:28
av thepirateboy
Om jag nu minns rätt (är jäkligt ringrostig) så kan du istället för testbänk skapa en fil tex ctrl.do för att generera dina signaler. I Modelsim skriver du

vsim <entity namn>
do ctrl.do

för att starta simulering.


Exempel på fil:

restart -f

force CLK 0 0, 1 50 -repeat 100
force RST 1
force IR5_BUS "00000"
force JC 0
force INT 0

run 20
force RST 0
force INT 1

run 130
force INT 0
force IR5_BUS "00001"

run 250
force IR5_BUS "11101"

run 250
force IR5_BUS "01111"

run 400
force IR5_BUS "00000"

run 400

Postat: 16 september 2007, 17:37:01
av Kango
Najs, ska nog pröva på båda två, dock verkar force kommandot lite rostigt.

Så här är mind VHDL-kod, kan påpeka att det blir väldigt konstig när jag kör force kommandona. Det är enbart clk och tre andra signaler som blir bra.

Rehnmaak, har du lite fler tips?

Kod: Markera allt

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity sar is port(
clk_50, data, startn: in std_logic; 
convc: out std_logic:='0'; 
dout: out std_logic:='0'; 
clk: out std_logic; 
dig_out: out std_logic_vector(3 downto 0)); 
end sar;

architecture state_machine of sar is
type StateType is (data0, data1, data2, data3, idle); 
signal state :StateType;
signal slow_clk :std_logic_vector(2 downto 0);

begin
state_shift:process(clk_50)
begin
	if rising_edge(clk_50) then
	if (slow_clk = 0) then
	case state is
		when idle =>
			dout<='1';
			if (startn = '0') then
			state <= data3;
			dig_out<="0111";
			convc<='1';
		else
			state <=idle;
		end if;
		when data3 => dig_out(3)<=data; dig_out(2)<='0';
			state <=data2;
			dout<= data;
			when data2 => dig_out(2)<=data; dig_out(1)<='0';
			state <=data1;
			dout<= data;
		when data1 => dig_out(1)<=data; dig_out(0)<='0';
			state <=data0;
			dout<= data;
			when data0 => dig_out(0)<=data;
			state <=idle;
			dout<= data;
			convc<='0';
		when others =>
			state <=idle;
		end case;
		end if;
		slow_clk<=slow_clk+1;
		clk<=slow_clk(2);
		end if;
	end process state_shift;
	end state_machine;

Postat: 16 september 2007, 18:54:18
av rehnmaak
Modelsim kommer att protestera mot din slow_clk. Du måste hantera att när slow_clk = "111" att den slår om till "000". Men det kanske finns någon option så att den struntar i det. Hittar du den får du gärna tala om var den finns :D

Postat: 16 september 2007, 20:40:44
av Kango
Jo, jag märkte av det :lol:, sprutar ut massa med XXX. Gah, detta programmet var svårt att få ut sina utsignaler i.

Postat: 16 september 2007, 20:49:35
av rehnmaak
Att den skriver XXX beror på att du inte har initierat slow_clk....