在现今应用FPGA进行芯片电路设计的领域,已经使用HDL语言以及拥有强大功能的逻辑综合工具来进行设计。同时,高速电路也越来越被普遍使用,这一趋势使得芯片设计工程师把眼光越来越多的投向对后端布局布线的控制,因为对于高速设计,精细的后端控制是保障电路可靠运行的重要条件。在实践中,精细的后端控制也越来越显出它的重要性,同时要求设计者投入到这个方面的时间也越来越多。
问题的提出
实际的应用中,由于综合工具的介入,由它所输出的网表,有时候是非常难被设计者所理解的。这主要由三个方面的原因引起:1. 网表中除了在源程序中的寄存器能够被明显标志以外,其它的组合逻辑被映射(Map)到LUT中,但综合工具并没有提供一种很有效且有意义的方式进行对组合逻辑的命名,这使得设计者不容易找到组合逻辑的对应关系;2. 网表中元件(Component)之间的连接变得非常复杂;3. 由于综合工具的运用,会“优化”掉一些它认为是“冗余”的逻辑或增加一些它认为是“必要”的逻辑。
上述因素直接影响到后端的布局布线控制。当然,设计者可以在约束文件(UCF)中使用用户套(U_Set)、层次套(HU_Set)以及设置一个设计层次中元件相对的距离等措施来做一些后端控制。这样的设置可以很好的控制寄存器的布局和布线,但并不能够很好地完成对组合电路的布局布线控制。很明显,对于高速设计,这样的控制显然是非常必要的。这使得我们要找到一种更好的方法来控制组合电路。
这个新方法应该满足以下两个条件。1. 对于高速设计,当通常控制方法难以达到要求的时候,这个新方法应该能够完全控制模块内部的布局布线;2. 用这个新方法建立的模块在上层调用的时候所采用的仿真模型应该很容易建立,并且很容易保证它和建立模块的功能上的一致性。满足这两个要求的方法就是建立宏模块,更准确的说是建立硬件宏模块,简称硬宏。
传统的建立硬宏的方式是在Xilinx提供的FPGA Editor中直接在FPGA内部来建立目标电路,然后把它存为一个宏文件。然后,在上层进行调用。这种方法的弊端是显而易见的。1. 要在这样一个“艰苦”的环境下建立一个硬宏是一件非常麻烦的事情。设计者必须进入到Slice内部,来控制一个Slice内部的器件选择和器件之间的连线,同时也正由于它非常的麻烦,导致了设计很容易出错;2. 这样设计出来的宏的功能验证非常繁琐;3. 要为这样的宏建立仿真模型也很麻烦,一般的方法是人为的直接编写一个行为仿真模型,然后在上层设计中调用这个仿真模型,然而要保证仿真模型和宏之间的一致性也是一件不太容易的事情。另外还有一种使用Xilinx的Foundation建立宏的方法,这个方法在进一步讨论部分将会提到它的不足之处。
解决方法
鉴于以上的原因,现在采用另外一个新的流程(图1)来设计并建立一个宏。
第一步,为了使设计者不必进入到Slice里面进行电路的设计,而有一个很好的设计环境,使用Aldec公司的Active-HDL来进行宏内部电路的输入。在Active-HDL中,有一个库管理(Library Manager)功能,在这个库管理中,有很多子库,每个子库都有它不同的用途。在这些子库中,Schematic子库专门为Xilinx提供图形输入的。设计者调用这类库的元件来建立宏的内部电路。
这一步需要注意:1.时钟进入芯片的时候,应该通过BUFGP进入。通过BUFGP把时钟引入全局时钟网络。BUFGP并不是一个物理上对应的元件,Xilinx只是为了方便设计者的调用,而把IBUFG和BUFG在表示上合成一个元件。但当用到DLL或其他时钟连接方式的时候,应该把BUFGP拆开,单独的使用IBUFG和BUFG;2.在各个PIN的位置,要加上相应电气参数的IBUF或OBUF;3. 强烈建议对SLICE里面的元件进行详细的了解;4.对于寄存器,寄存器和组合逻辑之间的连线,组合逻辑和组合逻辑之间的连线,都使用有意义的名字,以方便在下端工具中查看电路时,与上端电路图的对应;5.在设计的时候应该把关键路径记录下来,在下端检查的时候要防止出现组合电路竞争。
第二步,直接对这个电路进行功能仿真。Schematic库中的元件可以直接支持基于门级的功能仿真。直接对这个电路图仿真可以从一开始就保证宏的功能正确性。Active-HDL提供了一个非常友好的仿真界面。它可以把仿真波形进行存储,而且,在以后的仿真中可以把第一次仿真所存储的输入向量波形当成激励。这样的做法大大地提高了效率,因为不用再为了一个小模块而专门编写它的测试基准(Test Bench)。
第三步,由Active-HDL直接输出EDIF网表,在这个网表中记录了宏的内部电路信息。Active-HDL可以把图形转换成三种语言形式的网表,VHDL、Verilog HDL和EDIF。而其他的上层输入工具一般只能输出两种,VHDL和Verilog HDL,如Mentor Graphics的HDL Design Series。选择Diagram菜单中的Set Target HDL选项来实现这一语言的切换。请注意,Set Target HDL选项只有在图形输入方式的时候才出现在Diagram菜单中。
第四步,把Active-HDL产生的这个EDIF网表直接交给Xilinx的后端工具进行处理。这样,就绕开了综合工具的干预,使得精细的下端控制成为可能。值得注意的是,由于绕开了综合工具,很多综合工具原来要做的工作就必须由设计者自己去做。这就是为什么第一步提到要添加相应电气参数的IBUF和OBUF以及时钟引脚要添加全局时钟缓冲器(BUFG)的原因。如果在第一步中忘记了这一点,会直接导致后端的映射工具把设计中的电路全部清空,然后报告出错。后端工具只需要进行三个步骤的处理就可以了,即翻译、映射以及布局和布线,其他的处理都不需要。处理完后会生成一些关键的文件,分别是project_name.ngd、project_name.ncd和map.ncd。
第五步,把处理得到的project_name.ncd文件拿到FPGA Editor中进行宏的生成。注意在使用FPGA Editor打开这个文件的时候,应该选择Read Write模式进入。进入之后,首先应该做的工作就是把设计中所有的IBUF和OBUF全部删除。这可以在LIST窗口来进行。在删除的同时,与这些IBUF和OBUF连接的连线也被同步删除。这样一来,就只剩下了功能部分。值得一提的是,在第四步中映射对电路进行处理的时候会完成把组合电路映射到LUT的功能。但由于在第一步中对组合电路和组合电路之间的连线使用了有意义的名称命名,使得在这一步中要找到原始电路图中的对应并不难。这一点是使用综合工具流程所不能实现的。设计者通过名字的对应,就找到在第一步中记录的关键路径,通过使用Delay功能来显示线路延迟,从而判断电路是否可以工作。如果不行,使用FPGA Editor中的相应工具来进行路径的重新布线,这个布线可以使用人工布线。在这一步中严禁进行逻辑修改,而只允许进行布线修改。具体怎么使用FPGA Editor可以参考FPGA Editor用户指南。当完成了修改过后,把NCD文件另存为NMC文件,这样就生成了需要的硬宏。
第六步,生成宏的逻辑仿真模型。再回到Active-HDL中,打开宏的电路图,使用Set Target HDL的语言切换功能,把图形转成Verilog HDL网表或是VHDL网表。这个网表就可以作为宏的仿真模型。因为这个网表是由标准HDL形成,那么它可以在任何HDL仿真器中调用,如ModelSim和VCS等。
至此整个流程的介绍全部完成。
进一步的讨论
关于流程的替代方案。事实上,整个流程似乎用Xilinx的Foundation也能完成。但是,有一个关键的步骤Foundation是不能完成的,那就是Foundation不能根据电路图输出基于Verilog HDL和VHDL的仿真模型,这样直接影响了宏的仿真通用性。另外,Foundation自己提供的仿真环境又相当不完善。
关于仿真模型和宏的功能一致性。由于仿真模型和宏的网表都来自于一个电路图,这样从上层保证了两者的一致性。另外,在第五步中,严禁进行逻辑修改,又进一步的保证两者的功能一致性,排除第二次建模的可能,从而把人为的错误减到最低。
关于完全控制后端布局布线。在FPGA Editor中,设计者可以根据上下层名称对应来确定关键路径,从而进行完全人为的布局布线控制,这就是在第一步中使用有意义名称的原因所在。
很明显的一点,这个流程不应该作为一个大项目的主要开发流程,因为,这样人力消耗太多,同时也失去了使用HDL语言和开发综合工具的意义。比较合适的一种用法是把它使用在关键路径模块和常规控制不能达到预期要求的模块上,因为它可以提供对后端的完全人为的控制,排除工具对设计的干扰。将基于HDL语言的设计方法与这种建立并使用硬宏的方法相结合,对基于FPGA的高速电路设计大有裨益。
文章评论(0条评论)
登录后参与讨论