You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AXI-MM接口Valid/Ready握手异常问题排查与技术求助

AXI-MemoryMapped握手违规问题的根源解析

问题现象

单元测试中发现AXI-MemoryMapped接口的Valid/Ready握手违反规范:波形显示araddr在s_arvalid为高电平期间提前从8变为10,不符合AXI核心规则——当valid信号断言后,关联数据(此处为地址)必须保持稳定,直到ready信号断言完成握手。

测试平台驱动任务代码

负责驱动AXI读请求信号的任务代码如下:

task automatic read_rq(input logic [ADDR_WIDTH-1:0] addr);
    s_arvalid <= 1'b1;
    s_araddr <= addr;
    @(posedge clk);

    while (!s_arready) @(posedge clk);

    s_arvalid <= 1'b0;
endtask

该任务逻辑为:将地址送上总线并断言valid,等待一个时钟周期(即使ready已拉高也保持地址一个周期),之后若ready未拉高则持续等待,直到握手完成后拉低valid。此前多次碰到类似问题,仅通过微调代码解决,未明确根因,曾猜测存在竞争条件。

问题排查与临时解决

后续排查发现,问题源于新增的ready信号随机化代码混用了阻塞/非阻塞赋值:

always @(posedge clk) begin
    if (rst)
        ready <= 1'b0;
    else
        // ready 30% of the time
        ready = ($urandom_range(0, 2) == 0);
end

其中对ready使用了阻塞赋值=,而arready信号通过组合逻辑依赖ready(例如assign arready = ready;),导致arready被异步断言,破坏了握手时序。将阻塞赋值改为非阻塞赋值<=后,握手逻辑恢复正常。

原理深度解析

要理解问题本质,需明确SystemVerilog赋值的执行时序与AXI同步握手的要求:

  • 阻塞赋值=:在仿真的Active区域立即执行,赋值后变量值会立刻生效,后续同一时钟沿的代码会直接使用更新后的值。
  • 非阻塞赋值<=:在仿真的Non-Blocking Assignment (NBA)区域执行,晚于Active区域的所有组合逻辑计算,赋值操作会延迟到当前时钟沿的所有采样完成后才生效。
  • AXI的Valid/Ready握手是同步握手:握手完成的判定必须在同一个时钟沿上,valid和ready同时被采样为高电平。当always @(posedge clk)块中用阻塞赋值更新ready时,ready的值在当前时钟沿的Active区域就会改变,依赖它的组合逻辑arready会立刻同步变化,相当于在时钟沿中间异步触发了ready信号。此时驱动任务中的while (!s_arready)会在当前时钟沿尚未结束时就检测到ready为高,提前退出等待循环,导致下一次任务调用时,araddr会在当前valid还未完成握手时被更新,违反了valid拉高后数据必须稳定的AXI规范。
  • 改用非阻塞赋值后,ready的更新会延迟到NBA区域,此时当前时钟沿的所有采样操作已完成,arready只会在下一个时钟沿到来时才会更新,保证了握手信号的变化都在时钟沿同步发生,完全符合AXI的时序要求。

内容的提问来源于stack exchange,提问作者viterbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:43:24