OpenCores
URL https://opencores.org/ocsvn/btc_dsha256/btc_dsha256/trunk

Subversion Repositories btc_dsha256

[/] [btc_dsha256/] [trunk/] [rtl/] [vhdl/] [TestBench/] [btc_dsha_TB.vhd] - Rev 2

Go to most recent revision | Compare with Previous | Blame | View Log

library hotan;
use hotan.sha_256_pkg.all;
library ieee;
use ieee.NUMERIC_STD.all;
use ieee.STD_LOGIC_UNSIGNED.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
 
	-- Add your library and packages declaration here ...
 
entity btc_dsha_tb is
	-- Generic declarations of the tested unit
		generic(
		gBASE_DELAY : INTEGER := 1 );
end btc_dsha_tb;
 
architecture TB_ARCHITECTURE of btc_dsha_tb is
	-- Component declaration of the tested unit
	component btc_dsha
		generic(
		gBASE_DELAY : INTEGER := 1 );
	port(
		iClkReg : in STD_LOGIC;
		iClkProcess : in STD_LOGIC;
		iRst_async : in STD_LOGIC;
		iValid_p : in STD_LOGIC;
		ivAddr : in STD_LOGIC_VECTOR(3 downto 0);
		ivData : in STD_LOGIC_VECTOR(31 downto 0);
		oReachEnd : out STD_LOGIC;
		oFoundNonce : out STD_LOGIC;
		ovNonce : out STD_LOGIC_VECTOR(31 downto 0);
		ovDigest : out tDwordArray(0 to 7) );
	end component;
 
	component sha_256_chunk
	generic(
		gMSG_IS_CONSTANT : std_logic_vector(0 to 15) := (others=>'1');
		gH_IS_CONST : std_logic_vector(0 to 7) := (others=>'1');
		gBASE_DELAY : integer := 1
	);
	port(
		iClk : in STD_LOGIC;
		iRst_async : in STD_LOGIC;
		iValid : in STD_LOGIC;
		ivMsgDword : in tDwordArray(0 to 15);
		ivH0 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH1 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH2 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH3 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH4 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH5 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH6 : in STD_LOGIC_VECTOR(31 downto 0);
		ivH7 : in STD_LOGIC_VECTOR(31 downto 0);
		ovH0 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH1 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH2 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH3 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH4 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH5 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH6 : out STD_LOGIC_VECTOR(31 downto 0);
		ovH7 : out STD_LOGIC_VECTOR(31 downto 0) );
	end component; 
 
	component pipelines_without_reset IS
		GENERIC (gBUS_WIDTH : integer := 1; gNB_PIPELINES: integer range 1 to 255 := 2);
		PORT(
			iClk				: IN		STD_LOGIC;
			iInput				: IN		STD_LOGIC;
			ivInput				: IN		STD_LOGIC_VECTOR(gBUS_WIDTH-1 downto 0);
			oDelayed_output		: OUT		STD_LOGIC;
			ovDelayed_output	: OUT		STD_LOGIC_VECTOR(gBUS_WIDTH-1 downto 0)
		);
	end component;
 
	-- Stimulus signals - signals mapped to the input and inout ports of tested entity
	signal iClkReg : STD_LOGIC := '1';
	signal iClkProcess : STD_LOGIC := '1';
	signal iRst_async : STD_LOGIC := '1';
	signal iValid_p : STD_LOGIC := '0';
	signal ivAddr : STD_LOGIC_VECTOR(3 downto 0) := (others=>'0');
	signal ivData : STD_LOGIC_VECTOR(31 downto 0) := (others=>'0');
	-- Observed signals - signals mapped to the output ports of tested entity
	signal oReachEnd : STD_LOGIC := '0';
	signal oFoundNonce : STD_LOGIC := '0';
	signal ovNonce : STD_LOGIC_VECTOR(31 downto 0) := (others=>'0');
	signal ovDigest : tDwordArray(0 to 7) := (others=>(others=>'0'));
 
	-- Add your code here ...
	constant cCMD_ADDR : std_logic_vector(3 downto 0) := X"D";
	constant cCMD_IDLE : std_logic_vector(15 downto 0) := X"0000";
	constant cCMD_RESET : std_logic_vector(15 downto 0) := X"CAFE";
	constant cCMD_START : std_logic_vector(15 downto 0) := X"0001";
 
	signal svWork : tDwordArray(0 to 31) := (others=>(others=>'0'));
 
	signal siWriteCnt : std_logic_vector(31 downto 0) := (others => '0');
 
	signal sHashMidStateValidIn : std_logic := '0';	
	signal sHashMidStateValidOut : std_logic := '0';
	signal svHashMidStateDataOut : tDwordArray(0 to 7) := (others=>(others=>'0'));
	signal svMidState : tDwordArray(0 to 7) := (others=>(others=>'0'));	
	signal sMidStateValid : std_logic := '0';
 
begin
 
	-- Unit Under Test port map
	UUT : btc_dsha
		generic map (
			gBASE_DELAY => gBASE_DELAY
		)
 
		port map (
			iClkReg => iClkReg,
			iClkProcess => iClkProcess,
			iRst_async => iRst_async,
			iValid_p => iValid_p,
			ivAddr => ivAddr,
			ivData => ivData,
			oReachEnd => oReachEnd,
			oFoundNonce => oFoundNonce,
			ovNonce => ovNonce,
			ovDigest => ovDigest
		);
 
	-- Add your stimulus here ...
 
	iClkReg <= not iClkReg after 5 ns;
	iClkProcess <= not iClkProcess after 5 ns;
	iRst_async <= '0' after 71 ns;
 
	svWork(0) <= X"02000000" after 251 ns;
	svWork(1) <= X"ea144059" after 251 ns;
	svWork(2) <= X"2a8b0d36" after 251 ns;
	svWork(3) <= X"b2e5f8a4" after 251 ns;
	svWork(4) <= X"85db1c04" after 251 ns;
	svWork(5) <= X"ca9290ca" after 251 ns;
	svWork(6) <= X"05bdc7f2" after 251 ns;
	svWork(7) <= X"05000000" after 251 ns;
	svWork(8) <= X"00000000" after 251 ns;
	svWork(9) <= X"11dfffb5" after 251 ns;
	svWork(10) <= X"ad285596" after 251 ns;
	svWork(11) <= X"8e4403d0" after 251 ns;
	svWork(12) <= X"60bdf636" after 251 ns;
	svWork(13) <= X"a023e387" after 251 ns;
	svWork(14) <= X"2870bbdc" after 251 ns;
	svWork(15) <= X"92e0aede" after 251 ns;
	svWork(16) <= X"acde4c0e" after 251 ns;
	svWork(17) <= X"032A6C52" after 251 ns;
	svWork(18) <= X"85fc0a19" after 251 ns;
	svWork(19) <= X"0BCFA6B6" after 251 ns;
 
 
	process(iClkReg, iRst_async)
	begin
		if iRst_async = '1' then
			siWriteCnt <= (others => '0');
			iValid_p <= '0';
		elsif rising_edge(iClkReg) then
			if sMidStateValid = '1' then
				siWriteCnt <= siWriteCnt + '1';
			end if;
 
			if siWriteCnt(3 downto 0) = X"F" and siWriteCnt(15 downto 4) <= conv_std_logic_vector(13, 12) then
				iValid_p <= '1';
			else
				iValid_p <= '0';
			end if;
		end if;
	end process;
 
	process(iClkReg, iRst_async)
	begin
		if iRst_async = '1' then
			ivAddr <= (others=>'0');
			ivData <= (others=>'0');
		elsif rising_edge(iClkReg) then
			if siWriteCnt(3 downto 0) = X"F" then
				case siWriteCnt(15 downto 4) is
					when X"000" =>
					ivAddr <= X"0";
					ivData <= svMidState(0);
 
					when X"001" =>
					ivAddr <= X"1";
					ivData <= svMidState(1);
 
					when X"002" =>
					ivAddr <= X"2";
					ivData <= svMidState(2);
 
					when X"003" =>
					ivAddr <= X"3";
					ivData <= svMidState(3);
 
					when X"004" =>
					ivAddr <= X"4";
					ivData <= svMidState(4);
 
					when X"005" =>
					ivAddr <= X"5";
					ivData <= svMidState(5);
 
					when X"006" =>
					ivAddr <= X"6";
					ivData <= svMidState(6);
 
					when X"007" =>
					ivAddr <= X"7";
					ivData <= svMidState(7);
 
					when X"008" =>
					ivAddr <= X"8";
					ivData <= svWork(16);
 
					when X"009" =>
					ivAddr <= X"9";
					ivData <= svWork(17);
 
					when X"00A" =>
					ivAddr <= X"A";
					ivData <= svWork(18);
 
					when X"00B" =>
					ivAddr <= X"B";
					ivData <= svWork(19) - X"20";
 
					when X"00C" =>
					ivAddr <= X"C";
					ivData <= svWork(19); -- + X"02";
 
					when X"00D" =>
					ivAddr <= cCMD_ADDR;
					ivData <= X"0000" & cCMD_START;
 
					when others =>
					ivAddr <= cCMD_ADDR;
					ivData <= X"0000" & cCMD_IDLE;					
				end case;
			end if;
		end if;
	end process;
 
 
	sHashMidStateValidIn <= '1' after 251 ns, '0' after 261 ns;
 
	sha_256_chunk_inst_HashMidState : sha_256_chunk
		generic map(
			gMSG_IS_CONSTANT => (others=>'0'),
			gH_IS_CONST => (others=>'1'),
			gBASE_DELAY => gBASE_DELAY
		)
		port map (
			iClk => iClkProcess,
			iRst_async => iRst_async,
			iValid => sHashMidStateValidIn,
 
			ivMsgDword => svWork(0 to 15),
 
			ivH0 => X"6a09e667",
			ivH1 => X"bb67ae85",
			ivH2 => X"3c6ef372",
			ivH3 => X"a54ff53a",
			ivH4 => X"510e527f",
			ivH5 => X"9b05688c",
			ivH6 => X"1f83d9ab",
			ivH7 => X"5be0cd19",
 
			ovH0 => svHashMidStateDataOut(0),
			ovH1 => svHashMidStateDataOut(1),
			ovH2 => svHashMidStateDataOut(2),
			ovH3 => svHashMidStateDataOut(3),
			ovH4 => svHashMidStateDataOut(4),
			ovH5 => svHashMidStateDataOut(5),
			ovH6 => svHashMidStateDataOut(6),
			ovH7 => svHashMidStateDataOut(7)
		);
 
	pipelines_without_reset_Valid : pipelines_without_reset
		GENERIC map(gBUS_WIDTH => 1, gNB_PIPELINES => (64 * gBASE_DELAY + 1))
		PORT map(
			iClk => iClkProcess,
			iInput => sHashMidStateValidIn,
			ivInput => (others=>'0'),
			oDelayed_output => sHashMidStateValidOut,
			ovDelayed_output => open
		);
 
	process(iClkProcess)
	begin
		if rising_edge(iClkProcess) then
			if sHashMidStateValidOut = '1' then
				svMidState <= svHashMidStateDataOut;
				sMidStateValid <= '1';
			end if;
		end if;
	end process;
 
end TB_ARCHITECTURE;
 
configuration TESTBENCH_FOR_btc_dsha of btc_dsha_tb is
	for TB_ARCHITECTURE
		for UUT : btc_dsha
			use entity work.btc_dsha(behavioral);
		end for;
	end for;
end TESTBENCH_FOR_btc_dsha;
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.