第1章 前言 ASIC设计是一个非常具有挑战性的工作,从商业的角度来说,这是一个高风险的行业,从技术的角度来说,它又是一个高技术的职业,不仅要求我们工程师具有很高的技术水平,而且工作作风也应该戒骄戒躁、孜孜不倦、一丝不苟、寻根刨底。 在ASIC设计中主要分为两个部分:前端网表级和后端版图级。 我们目前从事的是前端网表级设计,采用VHDL语言描述的方式将需要实现的功能描述出来,然后进行仿真调试,使用FPGA作为验证的手段,最后提交给Foundry进行后端设计。在目前这种操作的模式下,功能实现是相当重要的一个过程,而功能实现的工具VHDL语言又是该过程的关键。为了降低ASIC设计的风险,保证电路的正常运行,特别对ASIC设计源码进行规定。 在ASIC设计中,需要我们设计工程师对硬件电路具有相当多的了解,并且很清楚语言所描述的电路结构,养成一种写语言的时候思考硬件电路的好习惯,这样可以让我们设计的电路更容易综合,也容易发现及修改设计的问题,尽量 避免采用状态机。 本文主要从时序电路、组合电路以及Foundry提供库三个方面描述VHDL书写规范。 第2章 时序电路 在ASIC设计中大多数电路都是时序电路。时序电路分为同步和异步两种,同步电路跟时钟相关,处理比较简单,构造的电路很健壮,容易维护,缺点就是时钟偏移带来的问题很难处理,并且电路性能达不到最优,在时钟不高和对面积要求不大的情况下可以采用。异步电路没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化。也就是说一个时刻允许一个输入发生变化,以避免输入信号之间造成的竞争冒险。 在同步电路设计中一般采用D触发器,异步电路设计中一般采用Latch。 本章主要从同步电路设计的角度分时钟处理、复位处理以及标准语言结构三个方面来做阐述。 2.1 时钟处理 时钟在同步电路设计中是电路稳定一个很重要的因素。在ASIC设计中,后端设计工程师往往需要对时钟进行加大驱动,采用时钟树结构处理时钟,以使时钟偏移最小,电路更加稳定。 在电路设计中要使用全局时钟,而且尽量只使用一个全局时钟,保证该时钟没有毛刺,稳定可靠。 在一般情况下不要采用门控时钟,如果必须采用,只有单频率系统中才行,并且不能用多个时钟来组合产生不同频率的时钟。 在时钟输入的电路中应该考虑输入的信号在时钟到来之前的建立时间和时钟过后的保持时间,只有在足够的建立和保持时间的情况下电路才可能稳定的工作。 2.2 复位处理 在上电复位时,采用异步复位,而其他清零或置位考虑同步方式。这样可以保证上电时每个触发器都能得到复位,而在电路正常工作时,尽量避免异步清零或置位,这样可以让电路都工作在由时钟驱动的电路中,保证电路可靠。 2.3 标准语言结构 在同步电路设计时,VHDL结构包括时钟、复位以及允许信号。在一个进程中只允许一个信号被驱动,信号取名必须是几个英文单词的缩写,而且要多用几个字母,以保证可阅读,同时必须有相应的注释。下面就是源码规范: --This process generate send_en signal for send data part,it will be valid when cfg_reg signal is send_en_part:process(RST,CLK,CFG_REG) begin if(RST=’1’) then SEND_EN <= ‘0’; elsif(CLK’event and CLK=’1’) then if(CFG_REG=’1’) then SEND_EN <= ‘1’; else SEND_EN <= ‘0’; end if; end if; end process; 这是一个标准的VHDL语言描述的触发器,其中信号名是英文单词的缩写,大写,标准语句全部小写。其中,SEND_EN是SEND 和ENABLE两个单词的缩写,CFG_REG是CONFIG和REGISTER的缩写。 在设计中,尽量让代码少一些if…then…else…嵌套语句,因为这样电路经过的级数会增多。在有else的情况下,一定要考虑前面的条件,就是说在前面条件不成立时,就会执行后面的语句。 第3章 组合电路 在我们的设计中,除了时序电路就是组合电路。 组合电路是几个信号按照与、或、非等组合而成的一个新的信号,这个新的信号再驱动其他电路,组合电路不同时序电路,它产生的信号在很多时候都会有毛刺,所以该信号不能直接锁定其他信号,只能输出给时钟作为使能信号,而且要保证在时钟到来时该信号已经稳定下来了。 组合电路标准代码如下: --This process deal with the select operation between cfg_cam and cfg_sram signal sel_cam_sram_part:process(CFG,CFG_CAM,CFG_SRAM) begin if(CFG=’1’) then CFG_SEL <= CFG_CAM; else CFG_SEL <= CFG_SRAM; end if; end process; 可以看出,在该设计中其实就是根据CFG信号进行选择输出CFG_SEL信号。没有时钟,该信号直接在CFG的控制下输出。 将上例用case 语句描述出来如下: --This case deal with the select operation between cfg_cam and cfg_sram signal sel_cam_sram_part:process(CFG,CFG_CAM,CFG_SRAM) begin case CFG is when 0=> CFG_SEL <= CFG_CAM; when 1=> CFG_SEL <= CFG_SRAM; when others=> CFG_SEL <= ‘0’; end case; end process; 两种描述的区别在于:case语句同步操作,if…then…语句按顺序操作,case语句电路比较大,延时比较小。在不同要求的情况下选择不同的描述方式。 第4章 Foundry提供库 在ASIC设计中,需要用到Foundry提供的各种库,标准的库不需要特别调用,只需用语言描述,在综合时调用该库就行了,但是还有一些库每家都不一样,在设计时我们先确定在哪家流片,再考虑需要用到哪些该家的库,然后查看资料,准备书写代码。因为我们的设计要在FPGA上验证,所以我们又得熟悉该家类似库,如果FPGA库与ASIC库不一样,切记一点,以ASIC库为主,将FPGA 库增加部分逻辑产生与ASIC库一致的元件,在ASIC设计和FPGA设计中互相更换就行了。千万不要让ASIC设计文件和FPGA文件不一致,不同的地方只是库元件不一样和调用不同。 代码描述如下: --This part design for ASIC_1,begin here fifo_asic_fuj:port map( CKIA=>CLK, IA=>DAT_IN, … ); --This part design for ASIC_1,end here --This part design for FPGA_1,begin here fifo_fpga_altera:port map( CLKA=>CLK, DATA=>DAT_IN, … ); --This part design for FPGA_1,end here 当我们需要验证时,采用下面FPGA库,当我们做ASIC时,采用上面ASIC库。切换时只需将不需要的语句注释就行了。当然,在FPGA设计中可以有另外一个文件,该文件包含了所有需切换的库。
文章评论(0条评论)
登录后参与讨论