认识Robei及Robei优势

第一章:认识工具,掌握基础

通过今天的学习,读者可以了解集成电路设计工具的历史背景情况,同时熟悉国内外的产业差距。今天的学习将为后面的操作打下基础,读者需要尽可能的熟悉软件和Verilog语法,了解Robei软件的结构和操作方式,并知道如何注册和寻找Robei资源。今天学习完成后,熟悉Verilog语言的读者可以加深记忆,刚刚开始学习FPGA设计的读者也可以轻松地掌握Verilog语言的结构和语法。

1.1 为什么要选择Robei

1.1.1. 背景介绍

提供EDA设计工具的厂家有Cadence,Synopsys,Mentor Graphics,Xilinx,Altera等公司,这些公司都是欧美的公司,中国的EDA设计工具却少的可怜。中国90%的芯片来自进口,已经引起了政府的重视和对集成电路产业的大力扶持,但是中国99%的芯片设计工具来自进口和盗版,目前政府对于集成电路设计工具支持却是凤毛麟角。集成电路产业的发展依托于集成电路设计工具的发展,设计工具是和集成电路产业的发展同步的,就像两条腿走路,缺了哪条腿都是畸形的发展。“工欲善其事,必先利其器”,在中国大力发展集成电路的大环境和氛围下,唯独缺失的是对集成电路工具的发展。当一个国家的某个产业的快速膨胀和繁荣是依赖于其他国家的利器的时候,就等于把这个产业的咽喉拱手让别的国家给掐住。这个产业的利润将会慢慢通过知识产权的诉讼形式流失进入到其他工具所有国。这种畸形的发展会导致欧美等国家顺利完成产业淘汰和升级,中国变成了集成电路产业链的最低端,只能依赖于微薄的利润生存,并准备着时不时的被掌握设计工具的国家过来“剪羊毛”。在EDA设计工具上,中国有没有可能和欧美进行抗衡和抵制?
欧美国家的EDA设计工具也联合本国的IP供应商,打造了一个知识产权产业链,对于一些常用的IP进行知识产权封锁,要求国内的的生产和设计厂商进行购买,否则就无法完成整体设计。而且国外掌握着对软件和IP更新升级的主动权,即使购买了IP,在一定时间之后,随着版本的升级,IP在不同的版本中不兼容,而且IP升级需要继续付费,同时新IP的使用方法不同,这就要求国内的产业链随着软件和IP的升级不断的更改设计,甚至重新设计,导致大量的人力、物力和财力的浪费,同时又不得不出钱购买,因为产业的依附性已经形成。我们如何能打破这个局面?
国内的高校在培养集成电路设计人才的时候,也是不求甚解,很多课时在讲IP的使用,而不是如何设计IP。如此以来,我们通过填鸭式教育培养了一批不会思考的集成电路设计工程师,这批不会思考的工程师在公司只会拿来主义, IP的封闭导致了中国集成电路产业的惰性,建立在这种惰性之上的创新都是空谈。但是随着集成电路大基金的投入,集成电路制造厂的规模扩建,新生产线的上线和产能的增加,如何快速培养更多的集成电路人才来设计和流片,用来喂饱这些新增的产能和高端工艺线?
仔细分析一下集成电路设计的历史,从最早的逻辑门搭建到原理图设计(软件化的集成电路芯片模组),再到编写Verilog或者VHDL的代码(充分灵活的设计方式),每一步都是为了让设计更方便,更简单,更抽象。未来的EDA工具会怎么样?
现在的EDA工具设计相当灵活,全部由代码实现功能并仿真。在设计中牵扯到大量的模块重用,进行例化,这个过程需要使用者清楚要进行例化的每个引脚和位宽,用户就需要在声明和设计中来回切换,不时查证引脚信号的定义,浪费了大量的时间。如何才能更方便更快速的进行例化?
在大型的设计中,需要反复的对一些细节或者模块进行修改,一旦用的多得模块被修改,用户中其他的设计就要更新,将所有用到被修改了的模块的地方进行更新牵扯到大量的时间,甚至是重新设计。如果能有一键更新,分层调整,将可以大大节约工作量。如何在软件中进行快速的自上而下和自下而上的协同设计并能实现一键更新?
集成电路的学习是一个痛苦而抽象的过程,它不像C语言软件一样,可以快速编译,所见即所得。EDA设计中语句是并行执行的,C语言中是串行执行的,如何能减小软件和硬件设计的鸿沟,让有C语言基础的人快速转变成硬件设计工程师?大多数EDA软件都是庞然巨物,要想入门EDA,首先必须把庞然巨物下载完成然后安装并熟悉使用,一旦运行巨物,就要吞噬电脑的大量内存和计算性能,有没有办法用最小的工具完成初学者的学习任务,而让电脑运行流畅不妨碍我打游戏呢?
因为缺乏竞争对手,国外的EDA公司在国内的售价高的离谱,几十万上百万一套软件已经是司空见惯。上规模的集成电路公司为了避免被起诉不得不花费天价来购买软件,而这些费用都是几年或者十几年从微薄的利润中积累出来的。小微集成电路企业无力支付天价的软件费用,只能采用盗版,这也为以后成长为大公司埋下了法律隐患。如何让中国的EDA设计工程师用得起正版EDA软件?如何让他们不再因为使用盗版而天天提心吊胆?

若贝公司推出的Robei可视化芯片设计工具是在各种现有的EDA工具的最上层加了一层,进行可视化的所见即所得的设计,同时向下跨越到设计仿真和波形查看,基本涵盖了设计前端的所有功能,实现RTL级别的设计仿真,减少了中国大部分工程师和学生对于国外EDA设计工具的依赖和减少国外EDA设计工具的进口使用量。以前,国外的EDA设计工具需要人手一个,这样的成本不是个人和中小公司能够负担的起的,现在,由于Robei的出现,我们只需要购买少量的后端设计工具,大大减小了开支。同时Robei支持的结构化和可视化设计,方便了模块重用,节省了设计公司和工程师的时间,提升了设计效率和提升了设计质量。目前的集成电路工具更多是面向设计工艺的,极少从设计者和学习者的使用方便触发,而且软件动辄上G或者几十G,对电脑性能要求也极高。Robei软件是一个以轻量决胜的软件,只有不到10M,可以减少学生学习的时间,提升学习的兴趣和效率,可以为集成电路行业培养更多的人才。
Robei打造了一个完全透明的IP平台,在这个平台上,我们将容纳更多会思考、会设计的工程师来打造更多更好的设计,所有的设计完全透明,用户在使用的时候可以随意更改和裁剪,也可以学习IP设计的相关思路。这个平台打造的是学习与贡献一体,鼓励贡献优质IP,定期公布设计项目,让更多有思想的工程师参与项目,打造IP共享社区,奖励优秀设计者。本来我们集成电路设计就落后很多,如果再采用知识自我封闭的理念,将会导致更加落后。Robei崇尚的是一种学完就分享的模式,让更多的设计者受益,让更大的设计变得方便可控。这个平台是对知识产权垄断的抗争,是兴起集成电路设计产业的的中坚力量。

1.1.2. EDA的发展史

最早的集成电路设计是依赖于逻辑门的,用74LS系列的芯片进行连接,实现一些基本的功能。随着技术的发展和演进,出现了PCB的设计,也就是板级的设计,可以让这些基本的逻辑单元器件布局到一个PCB板上实现。PCB的设计演进也单独的发展成了一个分支,一直延续使用到现在。在集成电路历史上,第一个可编程逻辑器件诞生于1985年,由硅谷的Xilinx公司推出。既然是可编程逻辑器件,自然少不了可以用于编程的EDA工具。
最早的EDA设计工具是原理图设计方式,原理图主要基于市场上常见的元器件进行组合连线设计。这种设计基本上是将逻辑门设计中的基础电路模块软件虚拟化之后提供在设计库中,用户可以用来软搭建出自己需要的系统,再写入到FPGA中。原理图的优点是设计非常直观,但是灵活性不够。如果在原理图中新增加一个不存在的设备器件,往往需要写代码、打包、更新到器件库、从器件库查找并使用等过程,一旦元器件设计有误,就会需要重新回到代码修改并重新打包。已经在设计中存在的器件需要重新更替。流程繁复浪费了设计师大量的时间,尤其是源代码不慎丢失,将会直接导致模块无法修改,设计师需要重新来过。
后来由于原理图设计中每个模块要对应于实际的芯片,设计灵活性差,导致了后来以VHDL和Verilog为主流的代码编程设计,所有的模块实现均采用代码编写实现。代码设计是目前非常流行的设计方式,无论是元器件接口定义,模块例化还是功能实现,全部用Verilog或者VHDL等语言设计实现。代码设计的优点是灵活,想写什么器件就写什么器件,缺陷是不够直观。工程师需要读完大段代码才能了解其功能和结构信息,同时在撰写例化的时候,需要依据代码进行编写例化,要反复对照和查看接口名称和数据宽度等信息,防止出错。例化的代码也是手写为主。
界面设计方式和代码设计方式各成一体,相互之间交叉很少。模块化设计体现不够完美,很多模块不公开。基于界面的设计在生成代码的过程中,掺杂了很多冗余信号,在出错后返回查看代码,增加了很多冗余信号的障碍。
21世纪之后,伴随着FPGA的越来越大,工艺越来越先进,逻辑资源使用量已经不是设计的瓶颈,这个时候出现了方便设计和使用的框图设计模式。最灵活的框图设计模式当属Robei,它采用了框图设计结构,代码设计算法的方式,让软件自动生成结构层代码并与用户输入的代码组合成完整的代码。这种设计方式既拥有原理图设计的直观,又拥有代码设计的灵活性。
认识Robei及Robei优势_第1张图片
自Xilinx公司1984年诞生到现在,其软件经历了14代以上的更新迭代。我们可以分析一下该公司的ISE设计工具的大小变化,来分析EDA软件的膨胀过程。Xilinx的ISE从最早的几十兆到现在的8个G,发展速度十分快,但是软件庞大毕竟不是好事,软件越大,问题越多,为了修复和维护这么庞大的软件,所需要的人力成本就越高,所以Xilinx公司有几千人做软件,远远超过做硬件设计的人数。在集成电路行业,软件的庞大是司空见惯,这是因为所有厂商都以芯片的结构为核心来设计软件,却忽略了用户的感受。从用户角度来说,软件的庞大就代表着下载耗费大量的时间,学习需要比较长的周期,运用的步骤复杂,每一步都要按部就班,稍有差错就要焦头烂额。Robei是一款面向用户的芯片设计工具,从诞生之日起,Robei开放软件让超过35万人试用,得到用户的体验和感受的问题,并在之后的版本中进行不断修改演进。这些意见来自美国、加拿大、中国、欧洲、韩国、日本等国家,能够让Robei快速匹配来自不同地域的用户体验感受。时至今日,Robei也在鼓励用户反馈问题,在意见采纳后,为每个用户提供奖励。
认识Robei及Robei优势_第2张图片
认识Robei及Robei优势_第3张图片

1.1.3. Robei的优势

Robei是一款可视化的跨平台EDA设计工具,提供了超级简化的设计流程,最新可视化的分层设计理念,透明的模型库以及非常友好的用户界面。Robei软件将芯片设计高度抽象化,并精简到三个基本元素,掌握这三个基本元素,就能很快地掌握Robei的使用技巧。该软件将先进的图形化与代码设计相融合,让框图与代码设计优势互补,弱势相互抵消。
认识Robei及Robei优势_第4张图片
Robei软件是在Verilog代码设计的基础上进一步抽象,让框图设计与代码设计实现完美融合。传统的原理图设计虽然看起来非常直观,但是灵活性差,用户要利用现成的模块来拼凑设计。而代码设计虽然相当灵活,但是密密麻麻的代码很不直观。Robei软件通过一种结构层面上图形化设计,算法层面上代码输入的方式使设计更加直观灵活。
认识Robei及Robei优势_第5张图片
认识Robei及Robei优势_第6张图片
目前EDA的设计首先需要工程师在脑海中设计结构,再根据结构手写代码,容易出错。现在工程师利用Robei软件可以边构思边设计结构,结构完成后工程师可以专注于写核心算法,软件自动生成结构层的代码并与工程师输入的算法代码结合仿真。这种设计可以让工程师专注在设计算法上,而不用去记任何引脚名称和数据宽度。同时该软件将模型设计、测试文件和引脚分配集成在一个超级简化的设计流程中,可以进行快速设计仿真。
认识Robei及Robei优势_第7张图片
Robei集成了先进的图形化与代码设计的优势,同时具备Verilog编译仿真和波形分析,可以实现各种系统的快速设计、仿真和测试。软件生成标准的Verilog代码,可直接与各种EDA工具相融合。Robei是最贴近用户的前端设计仿真软件,仿真后直接生成Verilog代码,可以直接在其他EDA设计工具中使用。
认识Robei及Robei优势_第8张图片
Robei也是一款跨平台的EDA仿真工具,不仅有Windows,Linux,Mac OS的版本,也有专门针对于Android平板的版本。到目前为止,Robei也是唯一一个可以在移动平台上设计仿真的EDA工具。
认识Robei及Robei优势_第9张图片

1.2 安装与注册

1.2.1. 安装

从Robei官方网站(http://robei.com)上下载最新版Robei软件。解压Robei.zip,然后双击Robei-setup.exe,在弹出的安全警告中选择“是”,如图1-2-1所示。
认识Robei及Robei优势_第10张图片
Robei安装界面会出现,如图1-2-2所示。
认识Robei及Robei优势_第11张图片
在弹出的窗口中点“Next”。
认识Robei及Robei优势_第12张图片
如需要更换路径,可以点“Browse…”按钮重新选择路径,如果不需要更改,继续在弹出的窗口中点“Next”。
认识Robei及Robei优势_第13张图片
点击Next。
认识Robei及Robei优势_第14张图片
点击“Install”。
认识Robei及Robei优势_第15张图片
等待执行完毕。
认识Robei及Robei优势_第16张图片
点击“Finish”,安装完毕。你可以从桌面上或者开始菜单栏中找到Robei,启动Robei会看到如下图1-2-8的界面。
认识Robei及Robei优势_第17张图片

1.2.2. 注册

打开Robei官方网站:http://robei.cn/register.php,注册新用户,用户名称中不能含有中文和空格。注册完成后可以登录后台购买Robei的注册码。Robei注册码分为四种不同的类型,学生版、个人版、教育版和专业版,请根据自身的需求选择购买。
获得注册码后,返回电脑上打开Robei软件,点击菜单“Help”,在下拉菜单里选择“Register”,如下图1-2-9所示。
认识Robei及Robei优势_第18张图片
在弹出的Register对话框中输入之前注册的用户名和密码,点击按钮“Get License”, 软件会弹出网页,在该网页中有相关的注册码信息。
认识Robei及Robei优势_第19张图片
认识Robei及Robei优势_第20张图片
复制Your License:后面的一串编码,并输入到Register对话框的“License*:”中,点击“Register”按钮。
认识Robei及Robei优势_第21张图片
如果看到下图1-2-13所示的对话框,恭喜你,注册成功。如果没有,请联系若贝公司:[email protected]。点击“Yes”按钮,退出注册。
认识Robei及Robei优势_第22张图片
一切准备就绪之后,关闭软件,重新启动,查看软件界面的最顶端,“Robei Trial”的字样已经消失,取而代之的是你的注册码的类型:学生版是“Robei Student”,个人版是“Robei Personal”,教育版是“Robei Education”,专业版是“Robei Professional”。无论何种版本都可以跟随本教程使用,只是能编译的设计个数受限。
认识Robei及Robei优势_第23张图片

1.3 如何使用Robei

Robei软件启动后,界面如图1-3-1所示,软件界面分为菜单,工具条,工具箱,属性栏,工作空间和输出窗口几个部分。菜单和工具条位于软件的顶部,与常见的软件工具一样,工具条上分布着一些常用的按钮。左侧的工具箱里包含设计好的模型,可以重复利用。用户可以在界面右侧的属性栏里修改当前设计模块的属性。中间的工作空间是主要设计区域,当前设计模块默认名为“module”。底部为输出窗口,用来显示错误以及警告信息。
认识Robei及Robei优势_第24张图片

1.3.1. 菜单和工具条

Robei为了方便用户使用,在顶部设有菜单和工具条。与文件相关的操作放在“File”菜单里,复制、粘贴、剪切和删除操作放置在“Edit”菜单里。与设计相关的操作比如添加模块、引脚、和连接线放在“Tools”菜单里。除了这些,还有在“Build”菜单里的执行仿真和查看波形操作,“View”菜单里的放大缩小操作。如果想恢复被错误关闭的窗口,用户可以到“Window”菜单下找出对应的窗口并打开。
认识Robei及Robei优势_第25张图片

1.3.2. 工具箱

工具箱分为两栏,第一栏“Current”对应的文件位置为当前工作文件夹,用来展示在当前目录下,用户开发的设计模型,其路径是用户当前模型所存储的文件夹。第二栏“System”是随Robei软件一起安装好的,里面的模型均由系统自带,其路径是“C:\ProgramData\Robei”。用户也可自行添加新的栏目,并给出所对应的文件夹,Robei会自动读取该文件夹里所有的Robei模型。添加方法是在“Toolbox”里点击右键,选择“Add”,系统会自动弹出添加库的对话框(如图1-2-3所示)。
认识Robei及Robei优势_第26张图片
认识Robei及Robei优势_第27张图片

1.3.3. 属性栏

属性栏窗口用来展示工作区域中被选中物体的属性。用户可以修改对应的属性,并按下回车键,修改的属性会直接展示在工作区域中。模型中有些属性是受保护的,所以不能修改。
认识Robei及Robei优势_第28张图片

1.3.4. 工作空间

工作空间是一个图形化设计区域,在这个空间,用户可以利用模块、模型、引脚和连接线来设计复杂的集成电路。工作空间由两个部分组成,一个是图形化设计视窗,一个是代码设计视窗,可以通过底端的“Graph”和“Code”选项卡进行切换。
认识Robei及Robei优势_第29张图片
认识Robei及Robei优势_第30张图片

1.3.5. 输出

输出窗口用来显示输出信息,包括错误信息和警告信息。
认识Robei及Robei优势_第31张图片
图1-3-6 输出窗口

1.4 Robei三元素

Robei用三个基本元素来代表Verilog里面的组成部分:模块、引脚和连接线。在Verilog语言里,电路用一系列模块(module)来描述。一个模块可以代表一个逻辑门,一个寄存器,一个ALU或者一个SOC系统。模块是一个抽象的芯片,在这个抽象的芯片上,又存在着抽象的引脚。引脚是模块中用来与外界通信的门户,每个引脚与其它的模块进行通信,都需要一个抽象的连接线。这个连接线可以是一根线,也可以是一个总线。

1.4.1. 模块

模块是设计流程中的基本元素,可以看作是一个黑盒子。在这个黑盒子里,设计者可以放置引脚用来做通信的门户,可以放置设计好的模型和输入实现该模块功能的算法代码。根据设计阶段分类,一个模块可以细分为不同的类型。正在开发的当前模块都是“Module”类型,但是一旦设计完毕,便会保存成“Model”,这个模型可以在其它的模块中使用,而且部分属性进行了写保护,不能随意修改。模块中还有其它的类型,包括含有激励代码,用来实现仿真的“Testbench”类型,实现FPGA引脚分配的“Constrain”类型。
认识Robei及Robei优势_第32张图片
(1)Module:Robei的基本类型,当前正在设计的集成电路模块,保存后自动变成“Model”,用户可以修改任何属性。
认识Robei及Robei优势_第33张图片
(2)Model:设计好的模块在其它模块中使用,自动变成“Model”类型。部分属性进行了写保护,但是用户还是可以修改其它的属性,如颜色、名称和参数等。
认识Robei及Robei优势_第34张图片
(3)Testbench:测试模块对于验证设计非常重要,测试模块用来给予激励,调用设计好的模块,用来验证设计结果。如果要看到仿真结果,请确保顶层激励模块的属性设置成“testbench”,否则看不到波形分析。
认识Robei及Robei优势_第35张图片
(4)Constrain:约束文件是用来对FPGA引脚进行分配的文件。因为每家FPGA厂商的引脚分配有不同的模式,所以Robei会根据不同的厂商自动生成对应于该厂商的引脚约束文件,但是在Robei软件上进行分配的方式是统一的。比如Xilinx ISE的引脚约束文件是UCF文件,Vivado的引脚约束文件是XDC文件,Altera的引脚约束文件是QSF文件。如果要分配的引脚是一个总线,用户可以在连接线上声明要分配的引脚在总线中的编号。
认识Robei及Robei优势_第36张图片
在引脚分配之前,用户需要在菜单“Settings”里面选择“FPGA”,用来选择正确的FPGA厂家。额外的约束可以用代码形式写在工作空间中的代码视窗中。
认识Robei及Robei优势_第37张图片
在菜单“View”的下拉菜单中选择“CodeView”, 就可以看到自动生成的引脚约束代码。
认识Robei及Robei优势_第38张图片

1.4.2. 引脚

引脚是一个抽象的概念,可以对应于物理芯片上的一根针,或者开发板上的一个连接口,或者芯片上的一个总线。引脚是模块的门户,是模块与外界通信的接口。引脚就如同在黑盒子上打孔,从外向内钻孔的时候,孔是外面大,里面小,这是输入。从内向外钻孔的时候,孔是里面大外面小,这就是输出。还有一种既可以输入也可以输出的,就是两个方向上同时钻孔,内外大小一样。
认识Robei及Robei优势_第39张图片
每个引脚的属性如图1-4-9所示。引脚的属性也有多种,如“reg”,“wire”,“supply”等。“Datasize”属性用来描述该引脚是单针还是总线。引脚只能在模块的边缘游走,不能进入模块也不能离开模块。当模块移动时,引脚也跟随移动。
注意:模型上的引脚的一些属性是写保护的,不能修改,但是位置和颜色信息可以随意调整。
认识Robei及Robei优势_第40张图片

1.4.3. 连接线

连接线用来连接两个引脚,并负责信号的传输。连接线就如同连接黑盒子上的两个孔的管子,两个孔之间要想水不洒出来,就需要密封的管子进行连接。集成电路也是一样,只不过集成电路使用的是导线连接,而流入流出的不再是水,而是电。
认识Robei及Robei优势_第41张图片
通常情况下,连接线会继承起始引脚的颜色和数据宽度信息,然后颜色渐变为目标引脚的颜色。根据数据宽度的不同,连接线的粗细也不尽相同。
认识Robei及Robei优势_第42张图片
模块、引脚和连接线是Robei的三元素,通过这三元素,Robei把复杂的集成电路设计简化到最简,进一步降低了对集成电路入门的要求,方便用户快速进入集成电路设计。

1.5 Verilog基础

1.5.1. 数据

(1)电路四种状态
Verilog用4个值来实现电平描述:0,1,Z和X。
认识Robei及Robei优势_第43张图片
(2)数值表示方法:位数+’+进制+值。
认识Robei及Robei优势_第44张图片
(3)数据类型
硬件的数据类型描述以驱动的方式来分类,常用的有两种:reg和wire。
认识Robei及Robei优势_第45张图片

1.5.2. 运算符

(1)逻辑运算符
认识Robei及Robei优势_第46张图片
(2)算术运算符
认识Robei及Robei优势_第47张图片
(3)比较运算符
认识Robei及Robei优势_第48张图片

1.5.3. 结构声明

由于Robei的存在,以下部分代码可以不用输入,省去用户的大量时间,但是用户需要了解这部分代码的存在。所以被省去的代码会在描述中提出。
1. 模块定义
Robei的每个框图代表一个模块,每个模块的声明都由“module”开始,然后是该模块的名称,之后的括号里面包含了输入和输出的引脚。最后要写上“endmodule”。
module dff(d,q,clk);
//这里开始编程
endmodule
认识Robei及Robei优势_第49张图片
2. 引脚定义
引脚的名称将会出现在模块定义的括号里面。模块定义完成后,在module和endmodule中间声明引脚的走向。箭头从外向内的是输入引脚,从内向外的是输出引脚,无箭头的是既可以做输入也可以做输出。有数据宽度的用中括号给出。紧接着,声明每个引脚信号的类型,一般是wire或者reg。
input p0;
inout p1;
output [3:0] p2;
wire p0;
wire p1;
reg [3:0] p2;
认识Robei及Robei优势_第50张图片
3. 连接线
连接线的定义是用连接线类型加上位宽和名称形成的,与引脚的类型定义类似,但是在Robei中,顶层模块与子模块的连接线可以不声明,直接连接引脚,所以部分连接线并不存在于代码中。
wire clkout_clk;
认识Robei及Robei优势_第51张图片
4. 例化
例化的时候根据模块的连接方式,确定每个引脚相连的引脚或者连接线,通过类似模块声明的方式进行例化。在例化的时候,有些时候需要空接一些信号,输入管脚悬空,该管脚输入为高阻 Z,输出管脚悬空,该管脚废弃不用。
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… );
实际举例如DFF的例化:
DFF d1 (.Q(QS),
.Qbar ( ),
.Data (D),
.Preset ( ), // 该管脚悬空
.Clock (CK) );
认识Robei及Robei优势_第52张图片

1.5.4. 代码撰写

1. 赋值语句
常用的赋值语句如assign,assign起的作用是将一个信号与另外一个信号直接进行相连,任何信号的变化都是同步的。Assign中等号左边信号必须是wire型。
认识Robei及Robei优势_第53张图片
2. 分支语句
if else
类似于C语言中的if else 的写法。如果if else写全,就会生成寄存器,但是只有if没有else的语句,将会生成锁存器。在硬件设计中应该尽量避免锁存器的产生。当有多条语句存在于if else中间的时候,需要用begin end将多条语句进行包含,此时begin end相当于C语言中的{}。
认识Robei及Robei优势_第54张图片
Case
类似于C语言中的case 的写法。如果case写全并且default值设置好,就会生成寄存器,否则将会生成锁存器。
认识Robei及Robei优势_第55张图片
3. 循环语句
For
类似于C语言中的For 的写法。但是Verilog中,没有自加的语句,所以没有i++,只能用i=i+1。
认识Robei及Robei优势_第56张图片
While
类似于C语言中的While 的写法。While 语句在执行时,首先判断循环执行条件表达式是否为真,如果真,执行后面的语句块, 然后再重新判断循环执行条件表达式是否为真, 为真的话, 再执行一遍后面的语句块,如此不断,直到条件表达式不为真。
认识Robei及Robei优势_第57张图片
4. 初始化与重复执行
Initial

Verilog中用initial进行初始化,initial 只执行一次,在0时刻执行。主要用在仿真测试模块中。
认识Robei及Robei优势_第58张图片
Always
Verilog中always一直重复执行到程序结束。Always有自己的敏感信号列表,用always@(敏感信号1 or敏感信号2 or …)来表示,当敏感信号发生改变的时候更新状态。
认识Robei及Robei优势_第59张图片
只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
5. 阻塞式赋值与非阻塞式赋值
阻塞赋值( = )
在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。在always中begin…end语句块中所有语句是顺序执行的,阻塞赋值是在上一条语句完全完成之后,才开始执行下一条语句的。
认识Robei及Robei优势_第60张图片

非阻塞赋值( <= )

先计算右边表达式的值并暂存在一个暂存器中,iD的值被保存在一个寄存器中,而oQA当前的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样oQB得到的是oQA的原始值而不是iD。
认识Robei及Robei优势_第61张图片
1.5.5. 一个模块的总结
module 模块名(引脚1,引脚2,……);
input [数据宽度] 输入引脚;
output[数据宽度] 输出引脚;
parameter 参数=默认值;
reg[数据宽度] 寄存性信号;
wire[数据宽度] 非寄存性信号;
//例化写法
模型名称 #(参数1,参数2,……) 例化名 (
.模型引脚1(连接的信号1),
.模型引脚2(连接的信号2),
……
);
//其他描述算法
//assign
assign 信号1=信号2;

//if else
if (条件) begin
执行语句;
end else begin
执行语句;
end

//case
case (变量):
第一个值:执行语句;
第二个值:执行语句;
……
default:默认执行语句;
endcase

//while
while(条件)begin
执行语句;
end

//always
always@(敏感信号1 or 敏感信号2 or ……)
语句嵌套;

//for
for(i=0;i<10;i=i+1) begin
语句嵌套;
end

endmodule

以上只是简单的总结,学习的过程就是实践积累的过程,只有不断的练习,才能真正掌握集成电路设计。

1.6. 第一天的总结

第一天的学习任务非常的繁重也非常的基础,只有掌握好这一天的内容,才能够快速动手掌握其他的环节学习。第一天我们了解了EDA的发展历程,了解了Robei的特点和三元素,安装并注册了Robei软件和初步学习了Verilog语言,这对后续的学习打下了坚实的基础。后面的学习以动手为主,希望读者能亲自动手跟着学习。

1.5 Verilog基础
1.5.1. 数据
(1)电路四种状态
Verilog用4个值来实现电平描述:0,1,Z和X。

(2)数值表示方法:位数+’+进制+值。
进制 示例 解释
二进制 3’b101 三位二进制数101
八进制 9’o17 九位八进制数17,相当于十进制的15
十进制 12 不加任何符号代表十进制数,例子就是12
’d11 用d代表十进制,该数是十进制的11
十六进制 64’hff01 64位十六进制FF01,十进制相当于65281
表1-5-1 数值进制表示方法
(3)数据类型
硬件的数据类型描述以驱动的方式来分类,常用的有两种:reg和wire。

1.5.2. 运算符
(1)逻辑运算符
逻辑运算 运算符 例句
与 & y=a&b;
或 | y=a|b;
异或 ^ y=a^b;
非 ~ y=~a;
逻辑与 && y=a&&b;
逻辑或 || y=a||b;
逻辑非 ! y=!a;
表1-5-2 逻辑运算表
(2)算术运算符

算术运算 运算符 例句
加 + y=a+b;
减 - y=a-b;
乘 * y=a*b;
除 / y=a/b;
取余 % y=a%b;
左移 << y=a< 右移 >> y=a>>b;
表1-5-3 算术运算表
(3)比较运算符
比较运算 运算符 例句
大于 > y=a>b;
小于 < y=a 等于 == y=a==b;
大于等于 >= y=a>=b;
小于等于 <= y=a<=b;
不等于 != y=a!=b;
表1-5-4 比较运算表
1.5.3. 结构声明
由于Robei的存在,以下部分代码可以不用输入,省去用户的大量时间,但是用户需要了解这部分代码的存在。所以被省去的代码会在描述中提出。

  1. 模块定义
    Robei的每个框图代表一个模块,每个模块的声明都由“module”开始,然后是该模块的名称,之后的括号里面包含了输入和输出的引脚。最后要写上“endmodule”。
    module dff(d,q,clk);
    //这里开始编程
    endmodule

图1-5-1 模块的定义
2. 引脚定义
引脚的名称将会出现在模块定义的括号里面。模块定义完成后,在module和endmodule中间声明引脚的走向。箭头从外向内的是输入引脚,从内向外的是输出引脚,无箭头的是既可以做输入也可以做输出。有数据宽度的用中括号给出。紧接着,声明每个引脚信号的类型,一般是wire或者reg。
input p0;
inout p1;
output [3:0] p2;
wire p0;
wire p1;
reg [3:0] p2;

图1-5-2 引脚的定义
3. 连接线
连接线的定义是用连接线类型加上位宽和名称形成的,与引脚的类型定义类似,但是在Robei中,顶层模块与子模块的连接线可以不声明,直接连接引脚,所以部分连接线并不存在于代码中。
wire clkout_clk;

图1-5-3 连接线的定义,只有clkout_clk声明了
4. 例化
例化的时候根据模块的连接方式,确定每个引脚相连的引脚或者连接线,通过类似模块声明的方式进行例化。在例化的时候,有些时候需要空接一些信号,输入管脚悬空,该管脚输入为高阻 Z,输出管脚悬空,该管脚废弃不用。
Design u_2( .(端口1(u_1的端口1),
.(端口2(u_1的端口2),
.(端口3(u_1的端口3),
…… );
实际举例如DFF的例化:
DFF d1 (.Q(QS),
.Qbar ( ),
.Data (D),
.Preset ( ), // 该管脚悬空
.Clock (CK) );

图1-5-4 例化声明
1.5.4. 代码撰写

  1. 赋值语句
    常用的赋值语句如assign,assign起的作用是将一个信号与另外一个信号直接进行相连,任何信号的变化都是同步的。Assign中等号左边信号必须是wire型。

图1-5-5 always语句
2. 分支语句
if else
类似于C语言中的if else 的写法。如果if else写全,就会生成寄存器,但是只有if没有else的语句,将会生成锁存器。在硬件设计中应该尽量避免锁存器的产生。当有多条语句存在于if else中间的时候,需要用begin end将多条语句进行包含,此时begin end相当于C语言中的{}。

图1-5-6 if else语句
Case
类似于C语言中的case 的写法。如果case写全并且default值设置好,就会生成寄存器,否则将会生成锁存器。

图1-5-7 Case语句
3. 循环语句
For
类似于C语言中的For 的写法。但是Verilog中,没有自加的语句,所以没有i++,只能用i=i+1。

图1-5-8 For语句
While
类似于C语言中的While 的写法。While 语句在执行时,首先判断循环执行条件表达式是否为真,如果真,执行后面的语句块, 然后再重新判断循环执行条件表达式是否为真, 为真的话, 再执行一遍后面的语句块,如此不断,直到条件表达式不为真。

图1-5-9 While语句
4. 初始化与重复执行
Initial
Verilog中用initial进行初始化,initial 只执行一次,在0时刻执行。主要用在仿真测试模块中。

图1-5-10 initial语句
Always
Verilog中always一直重复执行到程序结束。Always有自己的敏感信号列表,用always@(敏感信号1 or敏感信号2 or …)来表示,当敏感信号发生改变的时候更新状态。

图1-5-11 always语句
只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
5. 阻塞式赋值与非阻塞式赋值
阻塞赋值( = )
在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。在always中begin…end语句块中所有语句是顺序执行的,阻塞赋值是在上一条语句完全完成之后,才开始执行下一条语句的。

图1-5-12 阻塞式赋值语句

非阻塞赋值( <= )

先计算右边表达式的值并暂存在一个暂存器中,iD的值被保存在一个寄存器中,而oQA当前的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样oQB得到的是oQA的原始值而不是iD。

图1-5-12 非阻塞式赋值语句

1.5.5. 一个模块的总结
module 模块名(引脚1,引脚2,……);
input [数据宽度] 输入引脚;
output[数据宽度] 输出引脚;
parameter 参数=默认值;
reg[数据宽度] 寄存性信号;
wire[数据宽度] 非寄存性信号;
//例化写法
模型名称 #(参数1,参数2,……) 例化名 (
.模型引脚1(连接的信号1),
.模型引脚2(连接的信号2),
……
);
//其他描述算法
//assign
assign 信号1=信号2;

//if else
if (条件) begin
执行语句;
end else begin
执行语句;
end

//case
case (变量):
第一个值:执行语句;
第二个值:执行语句;
……
default:默认执行语句;
endcase

//while
while(条件)begin
执行语句;
end

//always
always@(敏感信号1 or 敏感信号2 or ……)
语句嵌套;

//for
for(i=0;i<10;i=i+1) begin
语句嵌套;
end

endmodule

以上只是简单的总结,学习的过程就是实践积累的过程,只有不断的练习,才能真正掌握集成电路设计。

1.6. 第一天的总结
第一天的学习任务非常的繁重也非常的基础,只有掌握好这一天的内容,才能够快速动手掌握其他的环节学习。第一天我们了解了EDA的发展历程,了解了Robei的特点和三元素,安装并注册了Robei软件和初步学习了Verilog语言,这对后续的学习打下了坚实的基础。后面的学习以动手为主,希望读者能亲自动手跟着学习。

你可能感兴趣的:(高校,Robei案例,FPGA,Robei,教育)