Formality:原语(primitive)的概念

Formality:原语(primitive)的概念

相关阅读

Formalityhttps://blog.ZEEKLOG.net/weixin_45791458/category_12841971.html?spm=1001.2014.3001.5482


        原语(primitive)一般指的是语言内置的基本构件,它们代表了基本的逻辑门和构件,通常用于建模电路的基本功能,例如Verilog中的门级建模会使用and、or等关键词表示单元门。Formality也存在原语的概念,这一般出现在对门级网表进行建模时,本文将对此进行详细解释。

        假设以例1所示的RTL代码作为参考设计(可以看出添加了// synopsys sync_set_reset综合指令让Design Compiler将其实现为带同步复位端的D触发器),例2所示的综合后网表作为实现设计,其中data_out_reg原语是一个带同步复位端的D触发器(FDS2)。

// 例1 module ref( input clk, input reset, input data_in, output reg data_out ); // synopsys sync_set_reset "reset" always @(posedge clk) begin if (reset) begin data_out <= 1'b0; end else begin data_out <= data_in; end end endmodule
// 例2 ///////////////////////////////////////////////////////////// // Created by: Synopsys DC Expert(TM) in wire load mode // Version : O-2018.06-SP1 // Date : Fri Jun 27 15:52:09 2025 ///////////////////////////////////////////////////////////// module ref ( clk, reset, data_in, data_out ); input clk, reset, data_in; output data_out; wire n1; FDS2 data_out_reg ( .CR(data_in), .D(n1), .CP(clk), .Q(data_out) ); IV U4 ( .A(reset), .Z(n1) ); endmodule 

        在Formality中完成了参考设计、实现设计和库文件的读取后,参考设计的结构如图1所示(注意勾选Primitive),原理图如图2所示。

图1 参考设计的结构

图2 参考设计的原理图

        可以看出,就像Design Compiler读取RTL代码后会将其转化为GTECH网表那样(其实GTECH也可以被认为是一种primitive),Formality读取RTL代码后直接将其用内部原语实现了,其中date_out_reg原语是一个有同步使能SL,同步数据输入SD和时钟CLK的D触发器。

        实现设计的结构如图3所示(注意勾选Primitive和Tech Cells),原理图如图4所示。

图3 实现设计的结构

 

图4 实现设计的原理图

        从图3所示的结构,我们可以看到来自标准单元库的date_out_reg单元(注意,这与参考设计中的date_out_reg原语不是一个概念)和U4单元,但是可以看出它们是可以再分的,U4单元由cell0原语组成,date_out_reg单元则由包括*dff.00**在内的四个原语组成。

        date_out_reg单元的内部结构如图5所示。

图5 date_out_reg单元的内部结构

        *dff.00**原语就像参考设计中的date_out_reg原语那样是一个有同步使能SL,同步数据输入SD和时钟CLK的D触发器,但此时搭配cell2原语实现了一个带同步复位端的D触发器。

        总结一下就是,为了让等价性检查更标准化,Formality将直接用内部原语实现RTL代码,而用功能等效的方式用内部原语实现门级网表中的各个标准单元,并最终对内部原语进行比较。在工艺库列表中,可以查看各个标准单元是如何映射到内部原语的,如图6所示。

图6 查看标准单元库中每个标准单元原语映射方式

        这也解释了为什么在进行比较点验证时,会将参考设计中的date_out_reg原语和实现设计中的date_out_reg/*dff.00**原语进行比较了,此时它们才应该是比较是否等价的对象,如图7所示。

图7 比较点的验证

Read more

Springboot 4.0十字路口:虚拟线程时代,WebFlux与WebMVC的终极选择

Springboot 4.0十字路口:虚拟线程时代,WebFlux与WebMVC的终极选择

🧑 博主简介:ZEEKLOG博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ” Springboot 4.0十字路口:虚拟线程时代,WebFlux与WebMVC的终极选择 当虚拟线程以革命性的姿态降临Java世界,一场关于并发编程范式的静默变革正在发生。Spring开发者站在了选择的十字路口。 2023年,Java 21将虚拟线程从预览特性转为正式功能,这一变化看似只是JVM内部的优化,实则撼动了整个

计算机毕业设计springboot礼物商城的设计与实践 基于SpringBoot的个性化礼品电商平台的设计与实现 基于Java Web的创意礼物在线销售系统的设计与开发

计算机毕业设计springboot礼物商城的设计与实践 基于SpringBoot的个性化礼品电商平台的设计与实现 基于Java Web的创意礼物在线销售系统的设计与开发

计算机毕业设计springboot礼物商城的设计与实践917jxi80(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 1. 随着消费升级和社交需求的多元化发展,礼品经济正迎来前所未有的增长机遇。传统礼品采购模式存在选品单一、缺乏个性、购买不便等痛点,难以满足当代消费者对情感表达和独特体验的追求。与此同时,电子商务技术的成熟为礼品行业数字化转型提供了坚实基础,个性化定制与线上购物的深度融合成为行业发展的新趋势。本系统正是在此背景下应运而生,旨在构建一个集礼品展示、个性定制、便捷交易于一体的综合性电商平台,通过技术手段赋能传统礼品行业,提升用户送礼体验,推动礼品消费向品质化、个性化方向发展。 本系统采用SpringBoot作为核心开发框架,结合Vue前端技术实现前后端分离架构,选用MySQL数据库存储业务数据,B/S架构确保系统的可访问性和易维护性。系统围绕用户购物体验和管理者运营需求展开设计,涵盖从商品浏览到订单完成的全流程业务闭环。前台为用户提供礼品信息浏览、个性化搜索筛选、购物车管理、在线支付、订单跟踪

openclaw喂饭教程!在 Linux 环境下快速完成安装、初始化与 Web UI 配置

openclaw喂饭教程!在 Linux 环境下快速完成安装、初始化与 Web UI 配置

前言 OpenClaw 是一款开源的 AI Agent 工具,但对第一次接触的用户来说,完整跑通流程并不直观。本文以 Linux 环境为例,详细记录了 OpenClaw 的安装、初始化流程、模型选择、TUI 使用方式,以及 TUI 与 Web UI 认证不一致导致的常见问题与解决方法,帮助你最快速度把 OpenClaw 真正跑起来 环境准备 1)安装nodejs curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install -y nodejs > node

前端虚拟列表实现:别再渲染10000个DOM节点了

前端虚拟列表实现:别再渲染10000个DOM节点了

前端虚拟列表实现:别再渲染10000个DOM节点了 毒舌时刻 这代码写得跟网红滤镜似的——仅供参考。 各位前端同行,咱们今天聊聊前端虚拟列表。别告诉我你还在一次性渲染10000个列表项,那感觉就像把10000本书全部摆在桌面上——既占地方又难找。 为什么你需要虚拟列表 最近看到一个项目,一个下拉列表有5000个选项,全部渲染导致页面卡死,我差点当场去世。我就想问:你是在做列表还是在做性能杀手? 反面教材 // 反面教材:一次性渲染所有数据 function BigList({ items }) { return ( <ul style={{ height: '400px', overflow: 'auto' }}> {items.map(item => ( <li key={item.id} style={{ height: '50px'