From 6a1c04608090cc8fc88aafac0b4899e4cbb9cae9 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Mon, 5 Apr 2021 10:20:02 -0700 Subject: Change our simulator timing model to use continuous assignment guards. Instead of depending on verilator getting $past right, this (ab-)uses the SystemVerilog scheduling model which allows us to get a consistent view of the universe by "isolating" the blocking updates. Easier to code to and seems to be more reliable in verilator. --- hdl/jtag_uart.sv | 43 ++++++++++++--------- hdl/mem.sv | 34 +++++++++------- hdl/top.sv | 115 +++++++++++++++++++++++++++++++------------------------ hdl/util.svh | 7 +--- 4 files changed, 113 insertions(+), 86 deletions(-) (limited to 'hdl') diff --git a/hdl/jtag_uart.sv b/hdl/jtag_uart.sv index ad4665e..2b5f334 100644 --- a/hdl/jtag_uart.sv +++ b/hdl/jtag_uart.sv @@ -9,15 +9,22 @@ module jtag_uart ( input bit clk , input bit reset - , input bit rx_ready `define rx_ready `past(rx_ready) + , input bit rx_ready , output bit rx_valid , output bit [7:0] rx_data , output bit tx_ready - , input bit tx_valid `define tx_valid `past(tx_valid) - , input bit [7:0] tx_data `define tx_data `past(tx_data) + , input bit tx_valid + , input bit [7:0] tx_data ); +`input(rx_ready) +`output(rx_valid) +`output(rx_data) +`output(tx_ready) +`input(tx_valid) +`input(tx_data) + `ifdef SYNTHESIS alt_jtag_atlantic @@ -28,12 +35,12 @@ alt_jtag_atlantic ) 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) + , .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 @@ -48,34 +55,34 @@ bit [7:0] tx_b_data; always_ff @(posedge clk) begin if (reset) begin - rx_valid = 0; - tx_ready = 0; + 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 (`rx_ready) rx_valid = 0; - if (!rx_valid && (sim_rx_data != 0)) begin + if (rx_ready_) rx_valid_ = 0; + if (!rx_valid_ && (sim_rx_data != 0)) begin `ifdef JTAG_UART_LOCAL_ECHO $write("%s", sim_rx_data); `endif - rx_valid = 1; - rx_data = sim_rx_data; + rx_valid_ = 1; + rx_data_ = sim_rx_data; ++sim_rx_addr; end // TX logic - if (tx_ready && `tx_valid) begin + if (tx_ready_ && tx_valid_) begin tx_b_valid = 1; - tx_b_data = `tx_data; + tx_b_data = tx_data_; end if (tx_b_valid) begin $write("%s", tx_b_data); tx_b_valid = 0; end - tx_ready = !tx_b_valid; + tx_ready_ = !tx_b_valid; end end diff --git a/hdl/mem.sv b/hdl/mem.sv index 9be5c4d..c362e37 100644 --- a/hdl/mem.sv +++ b/hdl/mem.sv @@ -5,10 +5,10 @@ module mem , input bit reset , output bit ready - , input bit valid `define valid `past(valid) - , input bit write `define write `past(write) - , input bit [ADDR_BITS-1:0] address `define address `past(address) - , input bit [DATA_BITS-1:0] write_data `define write_data `past(write_data) + , input bit valid + , input bit write + , input bit [ADDR_BITS-1:0] address + , input bit [DATA_BITS-1:0] write_data , output bit read_valid , output bit [DATA_BITS-1:0] read_data @@ -18,24 +18,32 @@ parameter ADDR_BITS; parameter DATA_BITS; parameter INIT_FILE; +`output(ready) +`input(valid) +`input(write) +`input(address) +`input(write_data) +`output(read_valid) +`output(read_data) + bit [DATA_BITS-1:0] storage [0:(1<