补全harness代码
时间: 2024-11-11 20:14:49 浏览: 10
为了补全 `harness.sv` 文件中的代码,使其能够正常运行并验证 `op_uart` 模块的功能,我们需要实现以下几个任务:
1. **Set_thru**:设置 `thru` 控制信号。
2. **Send**:发送数据。
3. **Rx_stimulus**:模拟接收数据。
以下是补全后的 `harness.sv` 文件代码:
```verilog
module harness;
// 时钟和复位信号
reg sys_clk;
reg sys_rst;
// CSR 接口信号
reg csr_we;
reg [13:0] csr_a;
reg [31:0] csr_di;
wire [31:0] csr_do;
// UART 信号
wire rx_irq;
wire tx_irq;
reg uart_rx;
wire uart_tx;
// 实例化 op_uart 模块
op_uart u_op_uart (
.sys_clk(sys_clk),
.sys_rst(sys_rst),
.csr_we(csr_we),
.csr_a(csr_a),
.csr_di(csr_di),
.csr_do(csr_do),
.rx_irq(rx_irq),
.tx_irq(tx_irq),
.uart_rx(uart_rx),
.uart_tx(uart_tx)
);
// 设置 through 模式
task Set_thru;
input sel;
begin
@(negedge sys_clk);
csr_we = 1;
csr_a = {12'h0, 2'b10};
csr_di = {31'b0, sel};
@(negedge sys_clk);
csr_we = 0;
end
endtask
// 发送数据
task Send;
input [7:0] data;
begin
// 写入数据到 TX_DATA 寄存器
@(negedge sys_clk);
csr_we = 1;
csr_a = 14'h00;
csr_di = data;
@(negedge sys_clk);
csr_we = 0;
// 等待 tx_irq 有效
while (!tx_irq) @(posedge sys_clk);
@(posedge sys_clk); // 等待一个时钟周期
end
endtask
// 模拟接收数据
task Rx_stimulus;
input [7:0] data;
integer bit_count;
begin
// 产生起始位
uart_rx = 0;
#(1 / (clk_freq * 1.0 / baud));
// 产生数据位
for (bit_count = 0; bit_count < 8; bit_count = bit_count + 1) begin
uart_rx = data[bit_count];
#(1 / (clk_freq * 1.0 / baud));
end
// 产生停止位
uart_rx = 1;
#(1 / (clk_freq * 1.0 / baud));
// 等待 rx_irq 有效
while (!rx_irq) @(posedge sys_clk);
@(posedge sys_clk); // 等待一个时钟周期
end
endtask
// 初始化时钟和复位信号
initial begin
sys_clk = 0;
forever #5 sys_clk = ~sys_clk; // 10ns 时钟周期
end
initial begin
sys_rst = 1;
#100 sys_rst = 0; // 保持复位 100ns 后释放
end
// 测试用例
initial begin
$fsdbDumpfile("uart.fsdb");
$fsdbDumpvars(0, harness);
// 设置 through 模式
Set_thru(1'b0);
// 发送数据
Send(8'hab);
Send(8'h26);
Send(8'h35);
// 模拟接收数据
Rx_stimulus(8'hcd);
#1000;
$display("Please check your waveform!!!!!!!!!!!!!!!!");
$finish;
end
endmodule
```
### 解释
1. **时钟和复位信号**:生成时钟信号 `sys_clk` 和复位信号 `sys_rst`。
2. **CSR 接口信号**:定义 CSR 接口信号,包括写使能 `csr_we`、地址 `csr_a`、数据输入 `csr_di` 和数据输出 `csr_do`。
3. **UART 信号**:定义 UART 信号,包括接收中断 `rx_irq`、发送中断 `tx_irq`、串行输入 `uart_rx` 和串行输出 `uart_tx`。
4. **实例化 `op_uart` 模块**:将 `op_uart` 模块实例化,并连接相应的信号。
5. **任务实现**:
- **Set_thru**:设置 `thru` 控制信号。
- **Send**:发送数据,包括写入数据到 `TX_DATA` 寄存器和等待 `tx_irq` 有效。
- **Rx_stimulus**:模拟接收数据,包括生成起始位、数据位和停止位,并等待 `rx_irq` 有效。
6. **初始化时钟和复位信号**:生成时钟信号和复位信号。
7. **测试用例**:设置 `through` 模式,发送数据,模拟接收数据,并生成波形文件供检查。
通过上述代码,你可以验证 `op_uart` 模块的功能,并通过观察波形文件来确认其正确性。
阅读全文