| // Copyright lowRISC contributors. | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| { | |
| name: "uart" | |
| import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", | |
| "hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson", | |
| "hw/dv/tools/dvsim/testplans/intr_test_testplan.hjson", | |
| "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", | |
| "uart_sec_cm_testplan.hjson"] | |
| testpoints: [ | |
| { | |
| name: smoke | |
| desc: ''' | |
| - UART smoke test with few bytes transmitted and received asynchronously and | |
| in parallel with scoreboard checks | |
| - TX and RX have 2 independent threads respectively. | |
| - program one Tx item in register and wait for it to complete at uart interface, | |
| before send another one | |
| - sequencally send one Rx byte, then immediately read from register and check it''' | |
| stage: V1 | |
| tests: ["uart_smoke"] | |
| } | |
| { | |
| name: base_random_seq | |
| desc: ''' | |
| - This is the basic sequence that is extended by most of random sequence. | |
| - TX and RX have 2 independent threads respectively. | |
| - TX: keep programming csr wdata with random delay when fifo isn't full | |
| - RX: 2 processes. One is to send item through uart interface when fifo isn't full | |
| and the other is to read csr rdata when fifo isn't empty''' | |
| stage: V2 | |
| tests: ["uart_tx_rx"] | |
| } | |
| { | |
| name: parity | |
| desc: '''Send / receive bytes with parity and odd parity enabled randomly.''' | |
| stage: V2 | |
| tests: ["uart_smoke", "uart_tx_rx"] | |
| } | |
| { | |
| name: parity_error | |
| desc: ''' | |
| - Enable parity and randomly set even/odd parity | |
| - Inject parity error randomly on data sent from rx and ensure the interrupt is | |
| raised''' | |
| stage: V2 | |
| tests: ["uart_rx_parity_err", "uart_intr"] | |
| } | |
| { | |
| name: watermark | |
| desc: ''' | |
| - Program random tx/rx fifo watermark level and keep sending random tx/rx data | |
| to fifo. | |
| - As the number of pending data entries in the tx/rx fifo reaches the programmed | |
| watermark level (fifo size >= watermark level), ensure that the watermark interrupt | |
| is asserted | |
| - Ensure interrupt stays asserted until cleared as well as fifo level dropped. | |
| The tx/rx watermark interrupt is sticky''' | |
| stage: V2 | |
| tests: ["uart_tx_rx", "uart_intr"] | |
| } | |
| { | |
| name: fifo_full | |
| desc: '''Send over 32 bytes of data but stop when fifo is full''' | |
| stage: V2 | |
| tests: ["uart_fifo_full"] | |
| } | |
| { | |
| name: fifo_overflow | |
| desc: ''' | |
| - Keep sending over 32 bytes of data over tx/rx fifo | |
| - Ensure excess data bytes are dropped and check overflow interrupt | |
| - This uart_fifo_overflow_vseq is extent from uart_fifo_full_vseq and override the | |
| constraint to be able to send data over fifo size''' | |
| stage: V2 | |
| tests: ["uart_fifo_overflow"] | |
| } | |
| { | |
| name: fifo_reset | |
| desc: ''' | |
| - Fill up the tx/rx fifo. After a random number of bytes shows up on fifo, reset | |
| the fifo and ensure that the remaining data bytes do not show up | |
| - this sequence is extent from uart_fifo_overflow_vseq, so it can also reset when fifo | |
| is at any level, including full or overflow''' | |
| stage: V2 | |
| tests: ["uart_fifo_reset"] | |
| } | |
| { | |
| name: rx_frame_err | |
| desc: ''' | |
| - Inject frame error in parity and non-parity cases by not setting stop bit = 1 | |
| - Ensure the interrupt gets asserted''' | |
| stage: V2 | |
| tests: ["uart_intr"] | |
| } | |
| { | |
| name: rx_break_err | |
| desc: ''' | |
| - Program random number of break detection characters | |
| - create a frame error scenario and send random number of 0 bytes | |
| - If that random number exceeds the programmed break characters | |
| - Ensure that the break_err interrupt is asserted''' | |
| stage: V2 | |
| tests: ["uart_intr"] | |
| } | |
| { | |
| name: rx_timeout | |
| desc: ''' | |
| - Program timeout_ctrl register to randomize the timeout. Send random number of | |
| data over rx | |
| - Wait until it's about to timeout, then check timeout interrupt doesn't fire. Wait | |
| for timeout and check timeout interrupt fires | |
| - Wait until it's about to timeout, then use either read csr rdata or send RX item | |
| through uart interface to reset timeout timer in order to ensure timeout never | |
| fires''' | |
| stage: V2 | |
| tests: ["uart_intr"] | |
| } | |
| { | |
| name: perf | |
| desc: '''Run fifo_full_vseq with very small delays''' | |
| stage: V2 | |
| tests: ["uart_perf"] | |
| } | |
| { | |
| name: sys_loopback | |
| desc: ''' | |
| - Enable system looback, then drive uart TX and data will be loopbacked through RX | |
| - After loopback is done, uart.RDATA will be equal to the data programmed to | |
| uart.WDATA''' | |
| stage: V2 | |
| tests: ["uart_loopback"] | |
| } | |
| { | |
| name: line_loopback | |
| desc: ''' | |
| - Enable line loopback and drive uart_rx with random data and random delay | |
| - Check uart_tx has same value as uart_rx. There is not synchronizer register between | |
| uart_rx and uart_tx during line loopback''' | |
| stage: V2 | |
| tests: ["uart_loopback"] | |
| } | |
| { | |
| name: rx_noise_filter | |
| desc: ''' | |
| - Use 16x fast clk to sample it, data on uart_rx need to be stable for 3 clocks, | |
| otherwise, data change won't be taken | |
| - Enable noise filter and drive many glitches. Each glitch doesn't lasts less than | |
| 3 clocks | |
| - Ensure the noise will be filterred out and it doesn't affect next normal | |
| transaction''' | |
| stage: V2 | |
| tests: ["uart_noise_filter"] | |
| } | |
| { | |
| name: rx_start_bit_filter | |
| desc: ''' | |
| - Start bit should last for at least half baud clock, otherwise, it will be dropped | |
| - It's always enabled. Drive start bit for less than half cycle. | |
| - Ensure the start bit will be dropped''' | |
| stage: V2 | |
| tests: ["uart_rx_start_bit_filter"] | |
| } | |
| { | |
| name: tx_overide | |
| desc: '''Enable override control and use register programming to drive uart output | |
| directly.''' | |
| stage: V2 | |
| tests: ["uart_tx_ovrd"] | |
| } | |
| { | |
| name: rx_oversample | |
| desc: ''' | |
| - Use 16x baud clock to sample uart rx | |
| - Drive uart rx with 16 bits value, using 16x baud clock | |
| - Read RX oversampled value and ensure it's same as driven value''' | |
| stage: V2 | |
| tests: ["uart_rx_oversample"] | |
| } | |
| { | |
| name: long_b2b_transfer | |
| desc: ''' | |
| - Reduce delay to fill TX fifo and read RX fifo to ensure back2back transfers | |
| - Use long back2back transfer to ensure clock difference won't be accumulated across transactions | |
| - Uart monitor checks the clock offset between sender and receiver is never over 1/4 of the period''' | |
| stage: V2 | |
| tests: ["uart_long_xfer_wo_dly"] | |
| } | |
| { | |
| name: stress_all | |
| desc: ''' | |
| - Combine above sequences in one test to run sequentially, except csr sequence and | |
| uart_rx_oversample_vseq (requires zero_delays) | |
| - Randomly add reset between each sequence''' | |
| stage: V2 | |
| tests: ["uart_stress_all"] | |
| } | |
| { | |
| name: stress_all_with_reset | |
| desc: '''Have random reset in parallel with stress_all and tl_errors sequences''' | |
| stage: V2 | |
| tests: ["uart_stress_all_with_rand_reset"] | |
| } | |
| ] | |
| covergroups: [ | |
| { | |
| name: foo_cg | |
| desc: ''' | |
| ''' | |
| } | |
| ] | |
| } |