`timescale 1 ns/10 ps // time-unit = 1 ns, precision = 10 ps
|
|
|
|
module tb_uart_reg;
|
|
|
|
reg clk = 0;
|
|
reg rst_n;
|
|
reg uart_rx;
|
|
wire uart_tx;
|
|
reg [7:0] tx_data = 0;
|
|
reg [7:0] rx_data = 0;
|
|
wire [3:0] led_n;
|
|
|
|
localparam clk_half_period = 50;
|
|
localparam uart_bit_period = 1000000000 / 9600;
|
|
localparam uart_bit_half_period = uart_bit_period/2;
|
|
|
|
uart_reg UUT (.clk_i(clk), .rst_n_i(rst_n), .uart_rx_i(uart_rx), .uart_tx_o(uart_tx), .led_n_o(led_n));
|
|
|
|
// set dumpfile
|
|
initial begin
|
|
$dumpfile ("tb_uart_reg.fst");
|
|
$dumpvars (0, tb_uart_reg);
|
|
end
|
|
|
|
// setup simulation
|
|
initial begin
|
|
rst_n = 1;
|
|
#1 rst_n = 0;
|
|
#20 rst_n = 1;
|
|
end
|
|
|
|
// generate clock with 100 mhz
|
|
always #clk_half_period clk = !clk;
|
|
|
|
initial begin
|
|
uart_rx = 1'b1;
|
|
end
|
|
|
|
initial
|
|
forever @(posedge rst_n) begin
|
|
uart_rx = 1'b1;
|
|
#uart_bit_period;
|
|
for (integer tx = 0; tx < 16; tx = tx + 1) begin
|
|
tx_data = tx;
|
|
$display ("UART send: 0x%h", tx_data);
|
|
uart_rx = 1'b0;
|
|
#uart_bit_period;
|
|
for (integer i = 0; i < 7; i = i + 1) begin
|
|
uart_rx = tx_data[i];
|
|
#uart_bit_period;
|
|
end
|
|
uart_rx = 1'b1;
|
|
#uart_bit_period;
|
|
#uart_bit_period
|
|
#uart_bit_period;
|
|
end
|
|
end
|
|
|
|
// Checker
|
|
always begin
|
|
wait (rst_n)
|
|
for (reg [7:0] rx = 0; rx < 16; rx = rx + 1) begin
|
|
@(negedge uart_tx)
|
|
#uart_bit_period;
|
|
#uart_bit_half_period;
|
|
for (integer i = 0; i < 7; i = i + 1) begin
|
|
rx_data[i] = uart_tx;
|
|
#uart_bit_period;
|
|
end
|
|
assert (rx_data == rx)
|
|
$display("UART recv: 0x%h", rx_data);
|
|
else
|
|
$warning("UART receive error, got 0x%h, expected 0x%h", rx_data, rx);
|
|
end
|
|
$display ("UART tests finished");
|
|
$finish;
|
|
end
|
|
|
|
|
|
endmodule
|