数字IC后端学习笔记:等效性检查和ECO

1.形式验证工具

        对于某些电路的移植,一般不需要对新电路进行仿真验证,而可以直接通过EDA工具来分析该电路的功能是否与原电路一致,此种验证方法可以大量减少验证时间,提高电路的效率。

        等效性检查(Equivalence Check)是目前形式验证的主流,用于比较两个电路逻辑功能的一致性。它是通过采用匹配点并比较这些点之间的逻辑来完成等效性检查的。其生成一种数据结构,并将其与相同输入特性曲线条件下的输出数值特性曲线进行比较。如果它们不同,则表示被比较的两个电路是不等效的。工具使用的具体流程如下图所示。首先需要给工具提供完整正确的原设计、相关的工艺库及准备验证的设计,其次需要对检查过程给定约束条件和设置参数,并确定比较范围和匹配点,如果结果不相等则需要进行诊断。它通常用来比较RTL代码和布局布线后提取的网表逻辑功能是否一致、加入扫描链之前和之后的网表在正常工作模式下的逻辑功能是否一致以及ECO修正之前和之后的网表逻辑功能是否一致。

        在ECO阶段,RTL不会经历完整的综合流程。当定位了一个错误或者在设计流程的最后阶段需要增加一个新的调整时,首先要确认对RTL功能修改,然后需要进行测试以确信所做的修改符合预期。此后直接在网表上进行修改。我们怎样才能确认修改后的网表与RTL是一致的呢?我们可以对修改后的网表进行门级仿真并检查修改是否达到了预期目标。但门级仿真是不能够提供担保的,不能100%的确定修改后的RTL和修改后的网表是等效的。

         下面是一些等效性检查工具。

生产厂商工具名
CadenceConformal
SynopsysFormality
MentorFormalPro
MagmaQuartz Forma

2.网表ECO

        ECO是一个重要的设计阶段。在ECO阶段,可以不对RTL代码进行重新综合,而是直接对网表进行修改。在接近芯片设计的最后阶段(tape-out)时,对RTL代码修改并重新综合会带来高昂的代价。如果只需要进行微小的修改,那么在tape-out之前可以通过ECO加以解决。下面是ECO的流程。

  • 在RTL代码上修正错误并对其进行验证,保证芯片功能符合预期。
  • 通过ECO,在网表上直接进行错误修复。可以添加或修改逻辑门来修复错误,ECO阶段能够进行的修复工作是受限的。典型情况下,可以增加几个触发器和一些逻辑门。如果涉及几百个触发器和几百个逻辑门,最好全部重新综合,这比ECO要简单。在ECO中,控制单元(状态机)的修改比数据通路的修改更容易。
  • 接下来在修改过的RTL代码和修改过的网表之间进行等效性检查以确保二者在功能上是等效的。

        由于ECO直接在网表上进行,网表修改后的功能不便于直接分析。下面将讨论两种典型的ECO方法。

        方法1:修改逻辑锥

        这一方法通过对已有的逻辑门进行增加和重新排列达到修改逻辑功能并与更新后的RTL功能匹配的目的。这涉及查看驱动触发器的逻辑锥,查看现有节点和对逻辑锥进行修改等操作。这需要采用试错法反复试验,但可以通过增加最少的逻辑门达到修改的目的。这一方法需要在修改区域附近空闲逻辑门数量较少时更为有效。ECO Compiler或Conformal LEC等工具可以帮助设计进行ECO。

        方法2:新逻辑覆盖

        采用此方法时,需要使用逻辑门额外地设计一组逻辑电路,其输出通过一个选择器接入现有的触发器。当满足给定的条件时,通过选择器可以选择我们需要的值,在其他条件下,通过选择器选择旧的值。这种方法更为直观,但需要使用更多的逻辑门。我们在下面将会采用方法2的例子加以分析。

        示例描述

        状态机从一个FIFO中读出数据,通过dataout和dataout_valid将其交给接收代理电路。接收代理电路通过target_rdy指出一个数据传输阶段的完成。换句话说,当dataout_valid和target_rdy都有效时,一个数据传输操作结束。控制器在一个数据传输阶段会始终驱动dataout和dataout_valid,直到target_rdy有效。状态机持续处于数据传输阶段,直到它从数据FIFO中读取到了end_of_pkt标识。在最后一个数据传输完成后,dataout_last信号有效。这是一个在两个代理之间进行数据传输的典型协议,两个代理可以通过dataout_valid和target_rdy分别进行流量控制。

        错误

        状态机在设计时有一个错误,它没有考虑到FIFO在包传输结束前(end_of_pkt信号前)可能暂时为空。如果数据FIFO被读空时包没有结束,状态机会对一个空的FIFO进行读操作,从而导致错误的发生。

        ECO修正

        在BURST_DATA状态时,跳转到另一个状态WAIT_NONEMPTY并等待FIFO进入非空状态。被注释的代码指出了需要增加的新状态和逻辑。这里需要创建一个新的状态,一些输出需要做出改变。示例代码如下:

reg [2:0] xmitstate, xmitstate_nxt;
reg fifo_rden;
reg [15:0] dataout, dataout_nxt;
reg dataout_valid, dataout_valid_nxt;
reg dataout_last, dataout_last_nxt;

parameter IDLE = 3'b000,
          DATA_AVAIL = 3'b001,
          FIRST_DATA = 3'b010,
          BURST_DATA = 3'b011,
          LAST_DATA = 3'b100;

//新加的状态
//parameter WAIT_NONEMPTY = 3'b101; 

always@(posedge clk, negedge rstb) begin
    if(!rstb) begin
        xmitstate <= IDLE;
        dataout <= 0;
        dataout_valid <= 0;
        dataout_last <= 0;
    end
    else begin
        xmitstate <= xmitstate_nxt;
        dataout <= dataout_nxt;
        dataout_valid <= dataout_valid_nxt;
        dataout_last <= dataout_last_nxt;
    end
end

always@(*) begin
    xmitstate_nxt = xmitstate;
    fifo_nxt = 1'b0;
    dataout_nxt = dataout;
    dataout_valid_nxt = 1'b0;
    dataout_last_nxt = 1'b0;
    
    case(xmistate)
        IDLE: begin
            if(start_xmit)
                xmitstate_nxt = DATA_AVAIL;
        end
        DATA_AVAIL: begin
            if(!fifo_empty) begin
                xmitstate = FIRST_DATA;
                fifo_rden = 1'b1;
            end
        end
        FIRST_DATA: begin
            data_out_nxt = fifo_rddata;
            dataout_valid_nxt = 1'b1;
            if(end_of_pkt) begin
                xmitstate_nxt = LAST_DATA;
                dataout_last_nxt = 1'b1;
            end
            else begin
                xmitstate_nxt = BURST_DATA;
                fifo_rden = 1'b1;
            end
        end
        BURST_DATA: begin
            if(target_rdy) begin
                data_out_nxt = fifo_rddata;
                dataout_valid_nxt = 1'b1;
                if(end_of_pkt) begin
                    xmitstate_nxt = LAST_DATA;
                    dataout_last_nxt = 1'b1;
                end
              //else if(fifo_empty)
              //    xmitstate_nxt = WAIT_NONEMPTY;
                else 
                    fifo_rden = 1'b1;
            end
            else begin
                dataout_nxt = data_out;
                dataout_valid_nxt = 1'b1;
            end
        end
        LAST_DATA: begin
            if(target_rdy)
                xmitstate_nxt = IDLE;
            else begin
                dataout_nxt = dataout;
                dataout_valid_nxt = 1'b1;
                dataout_last_nxt = 1'b1;
            end
        end
        /*新加的状态
        WAIT_NONEMPTY: begin
            if(target_rdy) begin
                if(!fifo_empty) begin
                    xmitstate_nxt = FIRST_DATA;
                    fifo_rden = 1'b1;
                end
                else 
                    xmitstate_nxt = DATA_AVAIL;
            end
            else 
                dataout_valid_nxt = 1'b1; 
                dataout_nxt = dataout;             
        end
        */
    endcase 
end

        进行ECO

        对于修改错误时新加入的RTL代码,需要改变xmistate_nxt[2:0], dataout_valid_nxt和fifo_rden。接下来我们要解决xmistate_nxt[2:0]逻辑,它可能是三者中最困难的。

        第一个覆盖条件

if((xmitstate == BURST_DATA) && target_rdy && !end_of_pkt && fifo_empty)
    xmitstate_nxt = WAIT_NONEMPTY

即

if((xmitstate == 3'b011) && target_rdy && !end_of_pkt && fifo_empty)
    xmitstate_nxt = 3'b101

        第二个覆盖条件

if((xmitstate == WAIT_NONEMPTY) && target_rdy && !fifo_empty)
    xmitstate_nxt = FIRST_DATA;

即

if((xmitstate == 3'b101) && target_rdy && !fifo_empty)
    xmitstate_nxt = 3'b010;

        第三个覆盖条件 

if((xmitstate == WAIT_NONEMPTY) && target_rdy && fifo_empty)
    xmitstate_nxt = DATA_AVAIL;

即

if((xmitstate == 3'b101) && target_rdy && fifo_empty)
    xmitstate_nxt = 3'b001;

        下图展示了对xmitstate[2]的ECO,对另外两个比特的ECO方法与此类似。当然,在实际ECO时,根据单元库可以选择的逻辑门,可以对逻辑电路进一步优化。在ECO时,最初进入xmitstate[2]触发器的输入,被切断并连接到一个由或门和与门构成的选择器,通过控制选择器可以决定选择新加入的逻辑分支还是最初的逻辑分支。以上三个覆盖条件不能同时全部满足,且可以发现第二和第三覆盖条件中,xmitstate[2]都为0,且用(xmitstate == 3'b101) && target_rdy就可同时覆盖这两者。这就导致了ECO中只出现了两个覆盖条件A和B。

        ECO的解释

        在图中的点A和点B处,有两个覆盖条件。当第一个覆盖条件(点A)为真时,我们希望xmitstate[2]的输入为1。当A为1时,或门OR-A输出为1,此时第二个覆盖条件为假,即B点为1,与门AND-B输出也为1。当第二个或第三个条件为真时,我们希望xmitstate[2]的输入为0,。在这种情况下,点B为0,且AND-B的输出也为0。这是在第二种和第三种覆盖条件下我们所期望的结果。

        总之,我们能够在第一种覆盖条件下得到1,在第二种和第三种条件下得到0。在这些条件下所得到的的逻辑值不依赖最初的条件,因为这些条件处于逻辑锥的前部。当所有覆盖条件均不为真时,点B为1,且点A为0,这使得点C(最初的值)传递到触发器的输入端。

 以上内容来源于《Verilog高级数字系统设计技术和实例分析》和《SOC设计方法与实现》

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

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

相关文章

给LLM装上知识:从LangChain+LLM的本地知识库问答到LLM与知识图谱的结合

第一部分 什么是LangChain&#xff1a;连接本地知识库与LLM的桥梁 作为一个 LLM 应用框架&#xff0c;LangChain 支持调用多种不同模型&#xff0c;提供相对统一、便捷的操作接口&#xff0c;让模型即插即用&#xff0c;这是其GitHub地址&#xff0c;其架构如下图所示 (点此查…

状态检测防火墙

状态检测防火墙原理 对于已经存在会话表的报文的检测过程比没有会话表的报文要短很多。通过对一条连接的首包进行检测并建立会话后,该条连接的绝大部分报文都不再需要重新检测。这就是状态检测防火墙的“状态检测机制”,相对于包过滤防火墙的“逐包检测机制”的改进之处。这种…

ChatLaw:中文法律大模型

论文题目&#xff1a;ChatLaw: Open-Source Legal Large Language Model with Integrated External Knowledge Bases   论文日期&#xff1a;2023/06/28   官网地址&#xff1a;https://www.chatlaw.cloud   论文地址&#xff1a;https://arxiv.org/abs/2306.16092   G…

Compose编排工具应用

补充&#xff1a; Docker Compose 文件&#xff1a;Docker Compose 是一个用于定义和运行多个 Docker 容器的工具。它使用 YAML 文件格式来描述应用程序的各个组件和其配置。以下是一个简单的示例&#xff1a; 在上面的示例中&#xff0c;我们定义了两个服务&#xff1a;web 和…

浅谈金融场景的风控策略

随着互联网垂直电商、消费金融等领域的快速崛起&#xff0c;用户及互联网、金融平台受到欺诈的风险也急剧增加。网络黑灰产已形成完整的、成熟的产业链&#xff0c;每年千亿级别的投入规模&#xff0c;超过1000万的“从业者”&#xff0c;其专业度也高于大多数技术人员&#xf…

Ubuntu 23.10 现在由Linux内核6.3提供支持

对于那些希望在Ubuntu上尝试最新的Linux 6.3内核系列的人来说&#xff0c;今天有一个好消息&#xff0c;因为即将发布的Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;已经重新基于Linux内核6.3。 Ubuntu 23.10的开发工作于4月底开始&#xff0c;基于目前的临时版本Ubu…

通过ioctl函数选择不同硬件的控制,LED 蜂鸣器 马达 风扇

通过ioctl函数选择不同硬件的控制&#xff0c;LED 蜂鸣器 马达 风扇 实验现象 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsigned int OSPEEDR; // 0x08volati…

【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现

文章目录 1.gcc编译过程1.1预处理1.2编译1.3汇编1.4链接 2.自动化构建工具-make和makefile2.1使用背景2.2两者的概念和区别2.3项目清理 3.Linux简单进度条的实现 1.gcc编译过程 1. 预处理&#xff08;进行宏替换)   2. 编译&#xff08;生成汇编)   3. 汇编&#xff08;生成…

【NX】NXOpen::BlockStyler::Tree的个人使用类分享

网上关于NXOpen::BlockStyler::Tree的例子不是太多&#xff0c;控件默认id名称为tree_control01&#xff0c;因为例子不多很多功能得自己写&#xff0c;虽然NXOpen::BlockStyler::Tree的封装已经不错了&#xff0c;但是实际使用起来也不是很方便&#xff0c;比如像获取所有节点…

【Git】 Git初相识

文章目录 1. Git的必要性1.1 提出问题1.2 解决问题1.3 注意事项 2. Git的安装2.1 kali下的安装2.3 Windows下的安装 3. Git的配置 1. Git的必要性 1.1 提出问题 在我们的学习或者工作中&#xff0c;经常会遇到一些比较难搞的上司或者老师&#xff0c;让我们交上去的文档改了又…

【UI设计】新拟态风格

新拟态风格 1.有且只有一个光源照射 那作者在追波上按钮也好还是卡片处理也好&#xff0c;仔细观察不难发现&#xff0c;它定了一个光源&#xff0c;是从左上向右下照射的&#xff0c;所以&#xff0c;越靠近光源的部分&#xff0c;越亮&#xff0c;远离光源的越暗&#xff08;…

Linux进程OOM-kill 监控和规避

目录 一、proc目录简介 二、Linux OOM机制说明 1、OOM killer机制 2、寻找系统中最先被OOM kill的进程 3、修改 oom_score_adj 一、proc目录简介 proc是linux系统中的一个虚拟文件系统&#xff0c;它实际上不含有任何真正的文件&#xff0c;/proc中的文件如同linux内核中的…

Elasticsearch Dump的详细安装和迁移es索引和数据的使用教程

前言 如果希望将数据导出到本地文件而不是通过编程方式处理&#xff0c;可以考虑使用Elasticsearch的导出工具&#xff0c;如Elasticsearch Dump&#xff08;Elasticdump&#xff09;或Elasticsearch Exporter。这些工具可以将Elasticsearch索引中的数据导出为可用于后续处理的…

通付盾发布UIAM白皮书,利用区块链、大模型AI,以及无证书分布式身份认证赋能工业互联网

简介 UIAM白皮书结合各行业与国内外IAM发展状况&#xff0c;对IAM发展历程、核心能力以及现代增强型IAM技术的演进路线进行探讨。探索身份和信息安全管理与区块链、大模型AI、无证书分布式身份认证等技术趋势&#xff0c;以及UIAM技术在工业互联网的应用。期望能够帮助企业组织…

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

mysql的两种安装方式(yum在线安装和通用二进制)

文章目录 msqly的安装一、yum在线安装二、通用二进制安装mysql msqly的安装 一、yum在线安装 yum是一种在线安装方式&#xff0c;通过官网网址在linux下载安装 首先是配置一个yum安装源 yum install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm也…

使用Jetpack Compose中的LazyRow

在Jetpack Compose中&#xff0c;我们可以使用LazyRow来创建一个水平滚动的列表&#xff0c;类似于传统Android开发中的HorizontalScrollView。在这篇博客中&#xff0c;我们将探讨如何在Jetpack Compose中使用LazyRow。 创建LazyRow 要创建一个LazyRow&#xff0c;我们需要创…

旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

如果你有一部旧手机正在闲置着&#xff0c;或者正考虑要将其丢弃&#xff0c;那么请暂停一下。因为这个旧手机可以成为你的无线网卡&#xff0c;帮助你在家中或出行时实现更快的网络下载速度&#xff0c;而且毫不费流量。接下来&#xff0c;我将告诉你如何将旧手机变成无线网卡…

idea中如何过滤某些文件不提交

文章目录 前言设置.gitignore文件解决方案 设置新的忽略文件具体步骤如下 常用过滤文件 前言 在开发过程中&#xff0c;经常会遇到一些文件是我们不想提交的内容。那么应该如何过滤掉&#xff1f;不去提交到我们的git仓库&#xff1f; 比如&#xff0c;我们常用的一些配置文件…

01_面向对象的设计原则

面向对象的设计原则 参考资料&#xff1a; 视频书籍 《设计模式&#xff1a;可复用面向对象软件的基础》 简介 面对复杂问题如何解决&#xff1f; 分解&#xff1a;分而治之&#xff0c;大问题分解成小问题。抽象&#xff1a;忽视非本质的细节&#xff0c;处理泛化和理想化…