hardware simulation techniques