带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
修正说明
- 给输入输出数据添加
signed声明,确保有符号数运算逻辑正确; - 将
m_axis_tdata、m_axis_tvalid、s_axis_tready声明为reg类型,适配时序赋值需求; - 移除
always块内的assign,改用非阻塞赋值<=; - 补充AXI-Stream握手逻辑,正确驱动
m_axis_tvalid和s_axis_tready; - 添加初始化块,避免信号上电后处于未知状态。
内容的提问来源于stack exchange,提问作者Parsa
相关产品推荐
相关产品推荐

