summaryrefslogtreecommitdiff
path: root/hdl/jtag_uart.sv
diff options
context:
space:
mode:
authorJulian Blake Kongslie2021-04-05 10:20:02 -0700
committerJulian Blake Kongslie2021-04-05 10:20:02 -0700
commit6a1c04608090cc8fc88aafac0b4899e4cbb9cae9 (patch)
tree9a03984357020c00dfeed299a8b321f832a48bd4 /hdl/jtag_uart.sv
parentMake PC ADDR-sized rather than DATA-sized for now (diff)
downloadnoncpu-6a1c04608090cc8fc88aafac0b4899e4cbb9cae9.tar.xz
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.
Diffstat (limited to 'hdl/jtag_uart.sv')
-rw-r--r--hdl/jtag_uart.sv43
1 files changed, 25 insertions, 18 deletions
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
9 ( input bit clk 9 ( input bit clk
10 , input bit reset 10 , input bit reset
11 11
12 , input bit rx_ready `define rx_ready `past(rx_ready) 12 , input bit rx_ready
13 , output bit rx_valid 13 , output bit rx_valid
14 , output bit [7:0] rx_data 14 , output bit [7:0] rx_data
15 15
16 , output bit tx_ready 16 , output bit tx_ready
17 , input bit tx_valid `define tx_valid `past(tx_valid) 17 , input bit tx_valid
18 , input bit [7:0] tx_data `define tx_data `past(tx_data) 18 , input bit [7:0] tx_data
19 ); 19 );
20 20
21`input(rx_ready)
22`output(rx_valid)
23`output(rx_data)
24`output(tx_ready)
25`input(tx_valid)
26`input(tx_data)
27
21`ifdef SYNTHESIS 28`ifdef SYNTHESIS
22 29
23alt_jtag_atlantic 30alt_jtag_atlantic
@@ -28,12 +35,12 @@ alt_jtag_atlantic
28 ) real_jtag 35 ) real_jtag
29 ( .clk(clk) 36 ( .clk(clk)
30 , .rst_n(!reset) 37 , .rst_n(!reset)
31 , .r_dat(tx_data) 38 , .r_dat(tx_data_)
32 , .r_val(tx_valid) 39 , .r_val(tx_valid_)
33 , .r_ena(tx_ready) 40 , .r_ena(tx_ready_)
34 , .t_dat(rx_data) 41 , .t_dat(rx_data_)
35 , .t_dav(rx_ready) 42 , .t_dav(rx_ready_)
36 , .t_ena(rx_valid) 43 , .t_ena(rx_valid_)
37 ); 44 );
38 45
39`else 46`else
@@ -48,34 +55,34 @@ bit [7:0] tx_b_data;
48 55
49always_ff @(posedge clk) begin 56always_ff @(posedge clk) begin
50 if (reset) begin 57 if (reset) begin
51 rx_valid = 0; 58 rx_valid_ = 0;
52 tx_ready = 0; 59 tx_ready_ = 0;
53 sim_rx_addr = 0; 60 sim_rx_addr = 0;
54 tx_b_valid = 0; 61 tx_b_valid = 0;
55 end else begin 62 end else begin
56 automatic bit [7:0] sim_rx_data = sim_rx_rom[sim_rx_addr]; 63 automatic bit [7:0] sim_rx_data = sim_rx_rom[sim_rx_addr];
57 64
58 // RX logic 65 // RX logic
59 if (`rx_ready) rx_valid = 0; 66 if (rx_ready_) rx_valid_ = 0;
60 if (!rx_valid && (sim_rx_data != 0)) begin 67 if (!rx_valid_ && (sim_rx_data != 0)) begin
61`ifdef JTAG_UART_LOCAL_ECHO 68`ifdef JTAG_UART_LOCAL_ECHO
62 $write("%s", sim_rx_data); 69 $write("%s", sim_rx_data);
63`endif 70`endif
64 rx_valid = 1; 71 rx_valid_ = 1;
65 rx_data = sim_rx_data; 72 rx_data_ = sim_rx_data;
66 ++sim_rx_addr; 73 ++sim_rx_addr;
67 end 74 end
68 75
69 // TX logic 76 // TX logic
70 if (tx_ready && `tx_valid) begin 77 if (tx_ready_ && tx_valid_) begin
71 tx_b_valid = 1; 78 tx_b_valid = 1;
72 tx_b_data = `tx_data; 79 tx_b_data = tx_data_;
73 end 80 end
74 if (tx_b_valid) begin 81 if (tx_b_valid) begin
75 $write("%s", tx_b_data); 82 $write("%s", tx_b_data);
76 tx_b_valid = 0; 83 tx_b_valid = 0;
77 end 84 end
78 tx_ready = !tx_b_valid; 85 tx_ready_ = !tx_b_valid;
79 end 86 end
80end 87end
81 88