diff options
| author | Julian Blake Kongslie | 2021-04-05 10:20:02 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2021-04-05 10:20:02 -0700 |
| commit | 6a1c04608090cc8fc88aafac0b4899e4cbb9cae9 (patch) | |
| tree | 9a03984357020c00dfeed299a8b321f832a48bd4 /hdl/jtag_uart.sv | |
| parent | Make PC ADDR-sized rather than DATA-sized for now (diff) | |
| download | noncpu-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.sv | 43 |
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 | ||
| 23 | alt_jtag_atlantic | 30 | alt_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 | ||
| 49 | always_ff @(posedge clk) begin | 56 | always_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 |
| 80 | end | 87 | end |
| 81 | 88 | ||
