PCIe debug设计:锁存ltssm 状态机

图1:debug设计添加位置

图2:ltssm状态切换图

LTSSM state: LTSSM state encoding:

• 00h: detect.quiet

• 01h: detect.active

• 02h: polling.active

• 03h: polling.compliance

• 04h: polling.configuration

• 05h: config.linkwidthstart

• 06h: config.linkwidthaccept

• 07h: config.lanenumwait

• 08h: config.lanenumaccept

• 09h: config.complete

• 0Ah: config.idle

• 0Bh: recovery.receiverlock

• 0Ch: recovery.equalization

• 0Dh: recovery.speed

• 0Eh: recovery.receiverconfig

• 0Fh: recovery.idle

• 10h: L0

• 11h: L0s

• 12h: L1.entry

• 13h: L1.idle

• 14h: L2.idle/L2.transmitwake

• 15h: reserved

• 16h: disable

• 17h: loopback.entry

• 18h: loopback.active

• 19h: loopback.exit

• 1Ah: hotreset

i_pcie_ltssm作为PCIe链路训练状态机的实时状态,能够有效显示当前链路的链路状态。

一旦PCIe出现问题,i_pcie_ltssm最近的数值跳变情况是进行分析的重要依据。本节采用移位寄存器实现了一种简单的锁存机制,能够锁存最近若干个(锁存个数已参数化)的数值。

图3 pcie_ltssm_debug波形图

如图所示,i_pcie_ltssm作为输入信号,每隔一段时间会发生变化,o_latch_ltssm作为状态锁存信号会送到cfg_csr模块。在如下代码波形中,o_latch_ltssm锁存了i_pcie_ltssm最近的10次数值,pcie_ltssm数值发生变化,则锁存一次。

o_latch_ltssm[#n][5] 为1(#n表示1~9)表示o_latch_ltssm[#n][4:0] 为有效锁存数据。

o_latch_ltssm[0][5:0] 表示最新的锁存结果

o_latch_ltssm[9][5:0] 表示最早的锁存结果

案例中代码采用移位的方式实现了i_pcie_ltssm数值的锁存,当i_pcie_ltssm数值发生变化,则由o_latch_ltssm[0][4:0]锁存最新的pcie_ltssm,o_latch_ltssm[0][5]置1表示当前锁存数值有效,而o_latch_ltssm[0][5:0] 锁存的数据则赋值给o_latch_ltssm[1][5:0] ,o_latch_ltssm[1][5:0] 锁存的数据则赋值给o_latch_ltssm[2][5:0] ,以此类推,o_latch_ltssm[8][5:0] 锁存的数据则赋值给o_latch_ltssm[9][5:0] ,而o_latch_ltssm[9][5:0]的锁存数据因为无处可存了,因此直接丢弃了。

module pcie_ltssm_debug
#(  parameter LTSSM_LATCH_NUM=10)
(
    input                                               clk                                     ,   //
    input                                               rst_n                                   ,   //
    input               [5-1:0]                         i_pcie_ltssm                            ,   //
    output  reg         [LTSSM_LATCH_NUM-1:0] [6-1:0]   o_latch_ltssm                               //

);

reg             [5-1:0]                                 i_pcie_ltssm_d1                           ;   //

reg             [LTSSM_LATCH_NUM-1:0]                   latch_ltssm_vld                          ;   //

always@(posedge clk)
    if(!rst_n) begin
        i_pcie_ltssm_d1                   <=              'b0                                     ;   
    end
    else begin
        i_pcie_ltssm_d1                   <=              i_pcie_ltssm                            ;   
    end
    
assign  latch_ltssm_vld                             =   (i_pcie_ltssm_d1!=i_pcie_ltssm)            ;   //


for (genvar i=0;i<LTSSM_LATCH_NUM;i=i+1) begin: latch_shift
    if(i==0)  begin
    always@(posedge clk)
        if(!rst_n) begin
            o_latch_ltssm[i][5-1:0]  <=              'b0                                     ;   
            o_latch_ltssm[i][5]      <=              'b0                                     ;   
        end
        else if(latch_ltssm_vld) begin
            o_latch_ltssm[i][5-1:0]  <=              i_pcie_ltssm                            ;   
            o_latch_ltssm[i][5]      <=              'b1                                     ;   
        end
    end
    else //i>0
    begin
    always@(posedge clk)
        if(!rst_n) begin
            o_latch_ltssm[i][5-1:0]  <=              'b0                                     ;   
            o_latch_ltssm[i][5]      <=              'b0                                     ;   
        end
        else if((latch_ltssm_vld&&o_latch_ltssm[i-1][5]) ) begin
            o_latch_ltssm[i][5-1:0]  <=              o_latch_ltssm[i-1][5-1:0]        ;   
            o_latch_ltssm[i][5]      <=              o_latch_ltssm[i-1][5]            ;   
        end
    end
    
end


endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析(时钟任务篇)

时钟概念 时间是非常重要的概念&#xff0c;我们整个学生阶段有个东西很重要,就是校园铃声. 它控制着上课,下课,吃饭,睡觉的节奏.没有它学校的管理就乱套了,老师拖课想拖多久就多久,那可不行,下课铃声一响就是在告诉老师时间到了,该停止了让学生HAPPY去了. 操作系统也一样&…

linux进程通信 ipc

进程通信 管道 父子进程创建命令 实现ls | wc -l 左边写端 &#xff0c;右边读端 父进程写 子进程读 int fd[2]; pipe(fd); fd[1] 是写 fd[0]是读 读之前关闭写 写之前关闭读 兄弟进程创建命令 无法进行管道通信可能是父进程也把握了读端和写端 可能会流入到父进程…

抓包理解协议

用的Wireshark 抓包 1.抓包网卡选择 - WLAN 无线网卡&#xff0c;其他是本地虚拟机的网卡 这里分别是开始捕获、停止捕获、重新捕获、网卡选择&#xff0c;下面是可以过滤选择 过滤tcp包 3次握手&#xff1a; source是源地址&#xff0c; destination是目标地址&#xff0c;in…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈。之前都安装过无数次了。这次被卡住了。 原来是这里原因 不成功是因为启动时连接没打钩。默认是打钩的。不知道怎么的我把勾去掉了。我还跑去设置bios。都没有用。

开放地址法解决哈希冲突

1.基本思想: 有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将元素存入. 2.开放地址法的常用方法: (1) 线性探测法: Hi(Hash(key)di)%m (1<i<m),其中:m为哈希表长度,di为增量序列1,2,……m-1,且dii;其实就是一旦有冲突,就找下一个空地…

【Spring MVC】_SpringMVC项目返回静态页面

目录 1. 创建与设计前端页面 2. 返回HTML静态页面 2.1 示例1&#xff1a;使用RestController 2.2 示例2&#xff1a;使用Controller 3. RestController与Controller 在本专栏关于SpringMVC项目的相关文章中&#xff0c;已经介绍了操作HTTP请求的方式&#xff0c;包括多种传…

CTFHub Web 信息泄漏(一)

目录遍历 打开题目 点击开始寻找flag 发现在flag_in_here页面中有四个文件夹 点击打开第一个文件夹 发现里面还有四个文件夹 再次点击打开第一个文件夹 里面什么都没有 尝试对所有文件夹依次都点击打开 在2/4中发现flag.txt 点击打开即可得到flag 不太懂这题的难点&#…

[RocketMq:基于容器化]:快速部署安装

文章目录 一&#xff1a;相关镜像准备&#xff1a;RocketNameServer1.1&#xff1a;查看相关镜像和版本1.2&#xff1a;拉取镜像1.3&#xff1a;配置和运行RocketNameServer容器 二&#xff1a;相关镜像准备&#xff1a;RocketBroker2.1&#xff1a;创建配置目录和broker配置文…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

【算法一则】【贪心】数组中的数可以拼装成的最大数

题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 示例 1&#xff1a; 输入&#xff1a;nums [10,2] …

基于canal监听MySQL binlog实现数据增量同步

一、背景 业务反馈客服消息列表查询速度慢&#xff0c;有时候甚至要差不多20秒&#xff0c;急需优化提升速度。 二、方案 引入 首先&#xff0c;体验系统&#xff0c;发现查询慢的正是消息列表查询接口。 接着去看代码的设计&#xff0c;流程比较长&#xff0c;但从代码逻…

应用监控(Prometheus + Grafana)

可用于应用监控的系统有很多&#xff0c;有的需要埋点(切面)、有的需要配置Agent(字节码增强)。本节我教大家另外一个监控系统的使用 —— Grafana。 Grafana 监控面板 这套监控主要用到了 SpringBoot Actuator Prometheus Grafana 三个模块组合的起来使用的监控。非常轻量好…

第一个大型汽车ITU-T车载语音通话质量实验室投入使用

中国汽车行业蓬勃发展&#xff0c;尤其是新能源汽车风起云涌&#xff0c;无论是国内还是海外需求旺盛的趋势下&#xff0c;除乘用车等紧凑型车外&#xff0c;中型汽车如MPV、小巴、小型物流车&#xff0c;大型汽车如重卡、泥头车等亦加入了手机互联、智驾的科技行列&#xff0c…

机器人-轨迹规划

旋转矩阵 旋转矩阵--R--一个3*3的矩阵&#xff0c;其每列的值时B坐标系在A坐标系上的投影值。 代表B坐标系相对于A坐标系的姿态。 旋转矩阵的转置矩阵 其实A相对于B的旋转矩阵就相当于把B的列放到行上就行。 视频 &#xff08;将矩阵的行列互换得到的新矩阵称为转置矩阵。&…

基于__torch_dispatch__机制的dump方法

基于__torch_dispatch__机制的dump方法 1.参考链接2.原理3.代码4.效果 之前拦截torch和torch.Tensor的办法,在处理backward时,不能看到aten算子的细节.以下基于__torch_dispatch__机制的方案更节约代码,且能看到调用栈 1.参考链接 [原理] (https://dev-discuss.pytorch.org/t…

matlab学习005-利用matlab设计滤波器

目录 一&#xff0c;含有多个频率成分的三角信号 1&#xff0c;以采样频率fs20KHz对信号采样&#xff0c; 画出信号的波形&#xff1b; 1&#xff09;前期基础 2&#xff09;波形图 3&#xff09;代码 2&#xff0c;选取合适的采样点数&#xff0c;利用DFT分析信号的…

FPGA 以太网通信UDP通信环回

1 实验任务 上位机通过网口调试助手发送数据给 FPGA &#xff0c; FPGA 通过 PL 端以太网接口接收数据并将接收到的数据发送给上位机&#xff0c;完成以太网 UDP 数据的环回。 2 系统设计 系统时钟经过PLL时钟模块后&#xff0c;生成了两种不同频率和相位的时钟信号&#…

基于SpringBoot+VueHome F家居系统的设计与实现

系统介绍 该Home F家居系统采用B/S架构、前后端分离以及MVC模型进行设计&#xff0c;并采用Java语言以及SpringBoot框架进行开发。本系统主要设计并完成了用户注册、登录&#xff0c;购买家具过程、个人信息修改等&#xff0c;商家添加家具信息、对家具进行发货&#xff0c;管理…