多路选择器与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
相关产品推荐
相关产品推荐

