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

带AXI接口的绝对值模块代码故障排查:干涉仪波形整流异常

你的Verilog绝对值模块问题排查与修正

代码存在的核心问题

  • always块内误用assign语句
    assign是组合逻辑的连续赋值关键字,绝对不能放在always时序块内部。时序逻辑中需要用寄存器赋值(推荐非阻塞赋值<=)来更新信号。

  • 接口信号未赋值
    模块里的m_axis_tvalid和s_axis_tready完全没有赋值逻辑,这会触发综合工具报错,同时不符合AXI-Stream的握手规则:

    • m_axis_tvalid需要标识输出数据是否有效;
    • s_axis_tready需要标识模块是否准备好接收输入数据。
  • 有符号数处理缺失
    s_axis_tdata默认是无符号类型,此时s_axis_tdata < 0的判断永远为假(无符号数不存在负数),必须显式声明为有符号类型才能正确识别负数并计算绝对值。

  • 时序赋值方式错误
    同步时序块中应使用非阻塞赋值<=,避免出现时序竞争问题,保证电路的稳定性。


修正后的代码

`timescale 1ns / 1ps

module abs(
  input clk,
  output reg signed [15:0] m_axis_tdata,
  input m_axis_tready,
  output reg m_axis_tvalid,
            
  input signed [15:0] s_axis_tdata,
  output reg s_axis_tready,
  input s_axis_tvalid 
);

// 初始化信号,避免未知状态
initial begin
  m_axis_tvalid = 1'b0;
  s_axis_tready = 1'b1; // 默认准备好接收输入,可根据实际需求调整
  m_axis_tdata = 16'sd0;
end

always@(posedge clk) begin
  // AXI-Stream握手逻辑:输入有效且输出准备好时处理数据
  if(m_axis_tready && s_axis_tvalid) begin 
    // 计算绝对值,使用非阻塞赋值保证时序正确性
    m_axis_tdata <= (s_axis_tdata < 0) ? -s_axis_tdata : s_axis_tdata;
    // 标记输出数据有效
    m_axis_tvalid <= 1'b1;
  end else begin
    // 输出未准备好时保持有效状态,否则拉低有效信号
    m_axis_tvalid <= m_axis_tready ? 1'b0 : 1'b1;
  end
  
  // 此处设置为始终准备接收输入,若有内部缓冲可调整逻辑
  s_axis_tready <= 1'b1;
end 
    
endmodule

修正说明

  1. 给输入输出数据添加signed声明,确保有符号数运算逻辑正确;
  2. 将m_axis_tdata、m_axis_tvalid、s_axis_tready声明为reg类型,适配时序赋值需求;
  3. 移除always块内的assign,改用非阻塞赋值<=;
  4. 补充AXI-Stream握手逻辑,正确驱动m_axis_tvalid和s_axis_tready;
  5. 添加初始化块,避免信号上电后处于未知状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:46:00