How to Create an Effective VHDL Test Bench for a Register File?

  • Thread starter Thread starter hinkypunk
  • Start date Start date
  • Tags Tags
    File Test
Click For Summary
SUMMARY

This discussion focuses on creating an effective VHDL test bench for a register file implementation. The user has successfully implemented the register file using VHDL, including components such as 16-bit registers, a 2-to-4 decoder, and multiplexers. However, they seek guidance on writing the stimulus process for the test bench to properly test the register file's functionality. The provided code snippets illustrate the structure of both the register file and its corresponding test bench.

PREREQUISITES
  • Understanding of VHDL syntax and structure
  • Familiarity with digital design concepts, including registers and multiplexers
  • Knowledge of simulation tools for VHDL, such as ModelSim or Vivado
  • Experience with test bench creation and stimulus generation in VHDL
NEXT STEPS
  • Research VHDL stimulus process design for effective test bench creation
  • Learn about VHDL simulation tools like ModelSim for debugging and testing
  • Explore advanced VHDL features such as assertions and functional coverage
  • Investigate best practices for writing reusable and maintainable VHDL test benches
USEFUL FOR

VHDL developers, digital design engineers, and students learning about hardware description languages who are looking to implement and test register files effectively.

hinkypunk
Messages
1
Reaction score
0
I am trying to implement a register file and a test bench in VHDL. I think I have the register file itself done ok so I just have to test it with the test bench now. I'm a little unsure as to how write the stimulus process however and was hoping that someone could point me the right way. This is what I have so far:

Register File
Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity register_file is
    Port ( src_s0 : in  STD_LOGIC;
           src_s1 : in  STD_LOGIC;
           des_A0 : in  STD_LOGIC;
           des_A1 : in  STD_LOGIC;
           Clk : in  STD_LOGIC;
           data_src : in  STD_LOGIC;
           data : in  STD_LOGIC_VECTOR (15 downto 0);
           reg0 : out  STD_LOGIC_VECTOR (15 downto 0);
           reg1 : out  STD_LOGIC_VECTOR (15 downto 0);
           reg2 : out  STD_LOGIC_VECTOR (15 downto 0);
           reg3 : out  STD_LOGIC_VECTOR (15 downto 0));
end register_file;

architecture Behavioral of register_file is
-- components

	-- 16 bit Register for register file
	COMPONENT reg4
	PORT(
			D : IN std_logic_vector(15 downto 0);
			load : IN std_logic;
			Clk : IN std_logic;
			Q : OUT std_logic_vector(15 downto 0)
			);
	END COMPONENT;
	
	-- 2 to 4 Decoder
	COMPONENT decoder_2to4
	PORT(
			A0 : IN std_logic;
			A1 : IN std_logic;
			Q0 : OUT std_logic;
			Q1 : OUT std_logic;
			Q2 : OUT std_logic;
			Q3 : OUT std_logic
			);
	END COMPONENT;
	
	-- 2 to 1 line multiplexer
	COMPONENT mux2_4bit
	PORT(
			In0 : IN std_logic_vector(15 downto 0);
			In1 : IN std_logic_vector(15 downto 0);
			s : IN std_logic;
			Z : OUT std_logic_vector(15 downto 0)
			);
	END COMPONENT;
	
	-- 4 to 1 line multiplexer
	COMPONENT mux4_4bit
	PORT(
			In0 : IN std_logic_vector(15 downto 0);
			In1 : IN std_logic_vector(15 downto 0);
			In2 : IN std_logic_vector(15 downto 0);
			In3 : IN std_logic_vector(15 downto 0);
			S0 : IN std_logic;
			S1 : IN std_logic;
			Z : OUT std_logic_vector(15 downto 0)
			);
	END COMPONENT;-- signals
signal load_reg0, load_reg1, load_reg2, load_reg3 : std_logic;
signal reg0_q, reg1_q, reg2_q, reg3_q,
			data_src_mux_out, src_reg : std_logic_vector(15 downto 0);begin
-- port maps

	--register 0
	reg00: reg4 PORT MAP(
				D => data_src_mux_out,
				load => load_reg0,
				Clk => Clk,
				Q => reg0_q
	);
	
	--register 1
	reg01: reg4 PORT MAP(
				D => data_src_mux_out,
				load => load_reg1,
				Clk => Clk,
				Q => reg1_q
	);
	
	--register 2
	reg02: reg4 PORT MAP(
				D => data_src_mux_out,
				load => load_reg2,
				Clk => Clk,
				Q => reg2_q
	);
	
	--register 3
	reg03: reg4 PORT MAP(
				D => data_src_mux_out,
				load => load_reg3,
				Clk => Clk,
				Q => reg3_q
	);
	
	-- Destination register decoder
	des_decoder_2to4: decoder_2to4 PORT MAP(
				A0 => des_A0,
				A1 => des_A1,
				Q0 => load_reg0,
				Q1 => load_reg1,
				Q2 => load_reg2,
				Q3 => load_reg3
	);
	
	-- 2 to 1 Data source multiplexer
	data_src_mux2_4bit: mux2_4bit PORT MAP(
				In0 => data,
				In1 => src_reg,
				s => data_src,
				Z => data_src_mux_out
	);
	
	-- 4to 1 source register multiplexer
	Inst_mux4_4bit: mux4_4bit PORT MAP(
				In0 => reg0_q,
				In1 => reg1_q,
				In2 => reg2_q,
				In3 => reg3_q,
				S0 => src_s0,
				S1 => src_s1,
				Z => src_reg
	);
	
	reg0 <= reg0_q;
	reg1 <= reg1_q;
	reg2 <= reg2_q;
	reg3 <= reg3_q;
	
end Behavioral;

Register File test bench
Code:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY register_file_tb IS
END register_file_tb;
 
ARCHITECTURE behavior OF register_file_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT register_file
    PORT(
         src_s0 : IN  std_logic;
         src_s1 : IN  std_logic;
         des_A0 : IN  std_logic;
         des_A1 : IN  std_logic;
         Clk : IN  std_logic;
         data_src : IN  std_logic;
         data : IN  std_logic_vector(15 downto 0);
         reg0 : OUT  std_logic_vector(15 downto 0);
         reg1 : OUT  std_logic_vector(15 downto 0);
         reg2 : OUT  std_logic_vector(15 downto 0);
         reg3 : OUT  std_logic_vector(15 downto 0)
        );
    END COMPONENT;
    

   --Inputs
   signal src_s0 : std_logic := '0';
   signal src_s1 : std_logic := '0';
   signal des_A0 : std_logic := '0';
   signal des_A1 : std_logic := '0';
   signal Clk : std_logic := '0';
   signal data_src : std_logic := '0';
   signal data : std_logic_vector(15 downto 0) := (others => '0');

 	--Outputs
   signal reg0 : std_logic_vector(15 downto 0);
   signal reg1 : std_logic_vector(15 downto 0);
   signal reg2 : std_logic_vector(15 downto 0);
   signal reg3 : std_logic_vector(15 downto 0);

   -- Clock period definitions
   constant Clk_period : time := 10 ns;
 
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: register_file PORT MAP (
          src_s0 => src_s0,
          src_s1 => src_s1,
          des_A0 => des_A0,
          des_A1 => des_A1,
          Clk => Clk,
          data_src => data_src,
          data => data,
          reg0 => reg0,
          reg1 => reg1,
          reg2 => reg2,
          reg3 => reg3
        );

   -- Clock process definitions
   Clk_process :process
   begin
		Clk <= '0';
		wait for Clk_period/2;
		Clk <= '1';
		wait for Clk_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin		
    
		data <= "0101010101010101";
		
			src_s0 <= '0'; src_s1 <= '0';
			des_A0 <= '0'; des_A1 <= '0';
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
				
			
		wait for 10 ns;
			data <= "0000111100001111";
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
		
		
		----
		
		data <= "0101010101010101";
		
		wait for 10 ns;
			src_s0 <= '1'; src_s1 <= '0';
			des_A0 <= '0'; des_A1 <= '0';
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
				
		
		wait for 10 ns;
			data <= "0000111100001111";
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
			
		----	
			
		data <= "0101010101010101";	
			
		wait for 10 ns;
			src_s0 <= '0'; src_s1 <= '1';
			des_A0 <= '0'; des_A1 <= '0';
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
				
				
		wait for 10 ns;
			data <= "0000111100001111";
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
				
		----	
		
		data <= "0101010101010101";
		
		wait for 10 ns;
			src_s0 <= '1'; src_s1 <= '1';
			des_A0 <= '0'; des_A1 <= '0';
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';
				
	
		wait for 10 ns;
			data <= "0000111100001111";
			
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '0';
				
			wait for 10 ns;
				des_A0 <= '0'; des_A1 <= '1';
				
			wait for 10 ns;
				des_A0 <= '1'; des_A1 <= '1';

     -- wait;
   end process;

END;
Am I going in the right way at all with it?
 
Physics news on Phys.org
please help me these is my first time on these forum.I didn't know where to post these question.A car and a truck start from rest at the same time, with the car initally some distance behind the the truck. The acceleration of the truck is 2.10m/s^2 and the acceleration of the car is 3.40 m/s^2. The car overtakes the truck after the truck has moved 40.0 m.how long does it takes the car to overtake the truck?

I tried to equate the distance traveled by both, abd it turns to be is if the car has traveled 40.m
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
3K
Replies
2
Views
3K
Replies
4
Views
5K
  • · Replies 1 ·
Replies
1
Views
12K
  • · Replies 2 ·
Replies
2
Views
12K
  • · Replies 1 ·
Replies
1
Views
7K
Replies
2
Views
6K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K