用SV写一个计算 AXI outstanding的checker
时间: 2024-03-05 13:47:25 浏览: 145
下面是一个用SystemVerilog写的AXI Outstanding Checker的代码:
```
module axi_outstanding_checker (
input logic clk, // 输入时钟信号
input logic rstn, // 复位信号,低电平有效
input logic arvalid, // AXI读地址有效信号
input logic awvalid, // AXI写地址有效信号
input logic rvalid, // AXI读数据有效信号
input logic wvalid, // AXI写数据有效信号
output logic [7:0] axi_outstanding
);
// 初始化
always_ff @(posedge clk, negedge rstn) begin
if (~rstn) begin
axi_outstanding <= 8'h0;
end
end
// AXI Outstanding计算器
always_ff @(posedge clk, negedge rstn) begin
if (~rstn) begin
axi_outstanding <= 8'h0;
end else begin
if (arvalid && !rvalid) begin
axi_outstanding <= axi_outstanding + 1;
end
if (awvalid && !wvalid) begin
axi_outstanding <= axi_outstanding + 1;
end
if (rvalid) begin
axi_outstanding <= axi_outstanding - 1;
end
if (wvalid) begin
axi_outstanding <= axi_outstanding - 1;
end
end
end
endmodule
```
在这个代码中,我们使用了SystemVerilog的always_ff块来表示时序逻辑。我们使用了一个8位宽的寄存器axi_outstanding来存储未完成的AXI事务数量,使用了always_ff块来计算未完成的AXI事务数量。
在always_ff块中,我们使用了异步复位和同步时钟信号。当复位信号rstn为低电平时,我们将axi_outstanding设置为0。在每个时钟上升沿时,我们检查AXI读地址有效信号arvalid和AXI写地址有效信号awvalid以及读写数据有效信号rvalid和wvalid来确定未完成的AXI事务数量。如果arvalid或awvalid有效,但rvalid或wvalid无效,则将未完成的AXI事务数量增加1。如果rvalid或wvalid有效,则将未完成的AXI事务数量减1。
这样,我们就可以使用上述代码来计算AXI Outstanding了。
阅读全文