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

多路选择器与D触发器实现数据混洗时的数据丢失及延迟问题求助

多路选择器与D触发器实现数据混洗时的数据丢失及延迟问题求助

Hey 各位大佬,我现在正在用多路选择器和D触发器实现输入数据的混洗功能,但仿真的时候发现中间有一个延迟,导致下一个数据直接消失了。下面是我的Verilog代码(为了查线,把一些内部信号也放到端口里当输出了):

module shuffle (in0,in1,s,clk,out0,out1,c1,c2,d1,d2,y1,y2);
input [4:0] in0,in1;
input clk,s;
output [4:0]out0,out1;
output [4:0] c1,c2,d1,d2,y1,y2;

dflip D1(in1,clk,y1);
dflip D2(y1,clk,c1);
dflip D3(c1,clk,c2);
mux2_1 m2(in0,c2,s,out1);
mux2_1 m1(c2,in0,s,y2);
dflip D4(y2,clk,d1);
dflip D5(d1,clk,d2);
dflip D6(d2,clk,out0);
endmodule

module dflip (d,clk,q);
input [4:0]d;
input clk;
output reg [4:0]q;
always @(posedge clk)
begin
   q <= d;
end
endmodule

module mux2_1 (d0, d1, s, y);
output [4:0]y;
input [4:0]d0, d1;
input s;
assign y = (s)? d1:d0;
endmodule

这是我的测试平台代码(未完成部分原样保留):

module shuffle_test;
reg [4:0] in0,in1;
reg clk,s;
wire [4:0] y1,c1,c2,y2,d1,d2;
wire [4:0] out0,out1;

shuffle s1 (.in0(in0),.in1(in1),.s...

目前的问题是仿真时出现了一个延迟,导致后续数据丢失。有没有大佬能帮忙分析下问题出在哪,或者给点调试的方向?


一些可能的排查方向和建议:

  • 先确认子模块功能正常:单独仿真dflip和mux2_1模块,验证D触发器是否能正确在时钟上升沿锁存数据,多路选择器是否能根据s信号正确切换输入。
  • 跟踪中间信号的波形:仿真时重点观察y1、c1、c2、y2这些内部信号,看数据是从哪一级开始丢失的——比如in1是否正确传到y1?c2是否是in1经过3个时钟周期后的延迟值?mux的输出是否符合预期?
  • 检查测试平台的激励时序:确保s信号的切换是和时钟边沿同步的,避免在时钟边沿附近切换导致mux输出出现毛刺,进而被触发器采到错误值。另外补全测试平台,给in0、in1设置不同的测试值,按周期切换s,观察每个时钟周期的信号变化。
  • 分析数据路径的延迟匹配:out1和out0的路径都是经过3级D触发器+1级mux,理论上延迟应该对称,但如果s信号的时序不对,可能导致某一路的数据没有被正确采样。
  • 检查竞争冒险问题:当s切换时,mux的两个输入是否在时钟边沿附近发生变化?如果是的话,可能会导致触发器采到不稳定的值,进而出现数据丢失。

备注:内容来源于stack exchange,提问作者Farah_Flutter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:49:28