`include "util.svh" module jtag_uart #( INSTANCE = 0 , RX_FIFO_BITS = 6 , TX_FIFO_BITS = 6 ) ( input bit clk , input bit reset , input bit rx_ready , output bit rx_valid , output bit [7:0] rx_data , output bit tx_ready , input bit tx_valid , input bit [7:0] tx_data ); `ifdef SYNTHESIS alt_jtag_atlantic #( .INSTANCE_ID(INSTANCE) , .LOG2_RXFIFO_DEPTH(RX_FIFO_BITS) , .LOG2_TXFIFO_DEPTH(TX_FIFO_BITS) , .SLD_AUTO_INSTANCE_INDEX("NO") ) real_jtag ( .clk(clk) , .rst_n(!reset) , .r_dat(tx_data) , .r_val(tx_valid) , .r_ena(tx_ready) , .t_dat(rx_data) , .t_dav(rx_ready) , .t_ena(rx_valid) ); `else `define DELAY_BITS 16 bit [`DELAY_BITS-1:0] delay; bit [7:0] sim_rx_rom [0:(1<<16)-1]; initial $readmemh("mem/jtag_uart.hex", sim_rx_rom); bit [15:0] sim_rx_addr; bit tx_b_valid; bit [7:0] tx_b_data; always_ff @(posedge clk) begin if (reset) begin delay = {(`DELAY_BITS){1'b1}}; rx_valid = 0; tx_ready = 0; sim_rx_addr = 0; tx_b_valid = 0; end else begin automatic bit [7:0] sim_rx_data = sim_rx_rom[sim_rx_addr]; // RX logic if (`lag(rx_ready)) rx_valid = 0; if (delay == 0) begin delay = {(`DELAY_BITS){1'b1}}; if (!rx_valid && (sim_rx_data != 8'hff)) begin `ifdef JTAG_UART_LOCAL_ECHO $write("%s", sim_rx_data); $fflush(); `endif rx_valid = 1; rx_data = sim_rx_data; ++sim_rx_addr; end end else begin --delay; end // TX logic if (tx_ready && `lag(tx_valid)) begin tx_b_valid = 1; tx_b_data = `lag(tx_data); end if (tx_b_valid) begin $write("%s", tx_b_data); $fflush(); tx_b_valid = 0; end tx_ready = !tx_b_valid; end end `endif endmodule