Open Core in preparation (开源准备中)

要毕业了,如何保存PhD期间的工作成了个问题。前途仍然渺茫。改变研究方向或者失去原有的工具链是很可能发生的事情。然而,还有那么多可以做而没有做的事情。思考再三,我决定把大部分的工作开源。一来也许我的那点东西也许对别人有用,另外也是种不断研究的激励,毕竟自己闷头搞是很容易灰心的。

现在正在整理我的异步片上网络路由器设计(时空复用的异步片上网络路由器)。已经在OpenCores网站上注册了一个新项目:http://opencores.org/project,async_sdm_noc

大部分的代码还在整理中,估计会在下个月答辩之前完成初步的代码上传。

Some findings about the synthesis of asynchronous circuits

As I failed to configure the SCIM input method on my Ubuntu and this is totally technical content, I dont bother to write in English.

Recently I am synthesizing several asynchronous router designs to compare the area, speed and power performance. Some results are not expected as before:

1. Back-annotating the floorplan to Design Compiler affects the synthesis results significantly. Normally it is not supposed to back-annotate the floorplan in synthesis. We hope that the results in place and routing would be compatible or finally converge to our timing constraints. However, at least for asynchronous circuits, it seems the logical synthesized timing without floorplan is too optimistic.

2. Asynchronous circuits need more area margin than synchronous circuits. For synchronous circuits, the normal floorplan margin for the die size is around 70%-80%. Now in my asynchronous circuits, it seems the margin should be around 50%-60%, otherwise, the speed performance would degrade significantly. A published paper in ASYNC’04 shown that an asynchronous router IP used an extreme margin of 35%. All these show that asynchronous circuits are even more area consuming when they are really placed and routed.

3. ICC can reduce the dynamic power by 5%-10% by using a saif file from the post-synthesis simulation. I was expecting a even larger power saving but now the saving by tools seems marginal.

4. With the back-annotated floorplan, DC seems to insert too many buffers which are not really necessary. The router after synthesis is around 130,000 um^2 (floorplan back-annotated). After place and routing, the area is reduced to 90,000 um^2. It is now hard to say. Without the floorplan, the timing is optimistic. With the floorplan, the area estimation is pessimistic.

用DC综合异步电路

一般来说是不能用同步电路的综合工具来综合异步电路。同步电路会自动插入缓冲器,而这些缓冲器可能毁坏QDI电路的时序特性。然而手动生成门级网表又如何保证DRC能满足流片要求呢?在我看来,为了满足max transition和max capacitence要求,缓冲器仍然是不可避免的。使用综合工具来综合异步电路仍然有可取之处。

回到主题。在这个帖子里,我会讲一些用DC综合异步电路的基本问题:

  1. 异步元件库
    实际上这个并不是很重要。当然我们需要建一个基本的硬件元件库。对于4-phase的异步电路来说,同步电路的元件库就基本够用。比如说一个C-element就可以用如下的语句描述:
            assign Z = (I1&I2) | (I1&Z) | (I2&Z);
    这种方式看起来很好,但是在后面会遇到问题。更好的方式是使用目标元件库来搭建一个C-element,比如:
            module c2 ( a0, a1, q );
            input a0;
            input a1;
            output q;
            AO222EHD U1 ( .A1(q), .A2(a0), .B1(q), .B2(a1), .C1(a0), .C2(a1), .O(q) );
            endmodule
    这样做的好处有两点:我们可以直接找到一个C-element的pin;在必要的时候可以使用dont_touch来保护C-element不被拆解。
  2. timing loop
    异步电路有很多timing loop。无论是否设定延迟优化约束,这些timing loop都必须被打断。否则DC很可能会产生错误的结果或者使用过多的内存而产生内部错误。
    打断这些timing loop可以用set_disable_timing命令。以下给出了如何把所有C-element的反馈回路打断:
            foreach_in_collection celln  [get_references -hierarchical c2_*] {
                set_disable_timing [get_object_name $celln]/U1 -from A1 -to O
                set_disable_timing [get_object_name $celln]/U1 -from B1 -to O
            }
    这里我们使用get_references来获得所有的C-element。对于每一个C-element,从反馈pin到输出的时间计算都被禁止,这样一个C-element就不存在timing loop了。在这里也可以看到直接用目标原件搭建异步元件库的好处。
  3. 限制buffer的使用
    元件库往往提供了不同驱动能力的缓冲器,从很小到很大。而实际的综合过程中,禁止使用驱动能力过小或过大的缓冲器往往能得到更好的时序并减少运行时间。驱动能力过小的缓冲器对时序没有太大的帮助,可能增大走线的难度同时增加了门数量(placement时间变长)。过大的缓冲器有较大的输入负载并有着较高的动态功耗。
  4. 限制max_transition和max_capacitence
    实际实验发现,即使没有设定任何延时约束,使用合适的DRC约束仍然能改变电路的速度性能。这里给出的建议是使用适中的max_transition和max_capacitence会得到较好的速度结果。
  5. 使用set_max_delay来约束延时
    显然在没有时钟的情况下我们不能使用clock来约束电路。用virtual clock往往也是行不通的。异步电路的控制电路较为复杂,直接使用virtual clock意味着使用input port到output port的简单约束。然而这种约束得到的关键路径往往和实际的关键路径相差甚远。用set_max_delay来设定更为细化的路径约束有更好的结果。需要指出的是,DC默认set_max_delay的起点不能是其他时序路径的中间点。也就是说,一旦一个pin被设为一个path的起点,那么它也被设上了disable_timing的属性。所以,用set_max_delay来打断timing loop也是一个有效的方法(在该约束的理解上,SoC encounter和ICC不同,所以最好使用ICC为布局布线工具)。
  6. 合理的约束
    所有的路径最好都有约束。这里包括关键路径和主要的反馈路径。但是他们有区别。对于关键路径我们需要它尽量得快,但是反馈路径,只要足够快就可以。所以在约束的时候,对于关键路径可以过约束,但是对于反馈路径,一定不能过约束。
  7. 使用不同的权重
    DC的slack计算是negtive_slack*weight。通过控制不同路径的weight,我们就能够告诉DC先解决那些路径的时序问题(DC先解决slack最大的路径)。设定不同路径的权重可以使用group_path命令。
  8. min library
    同步电路往往使用min_max分析。用max library分析setup,同时用min library分析hold。对于异步电路来说,我们不需要分析hold问题(max_delay属于setup,min_delay属于hold)。这样我们就可以把min library换成typical library。这样有一个好处,就是DC生成的sdf文件中,min_delay实际上是typ_delay。如果需要得到在typical环境下的速度性能,仿真的时候使用sdf的min delay就可以了。

用NC-Verilog进行SystemC与Verilog HDL的混仿

    最近老是要测试自己的模块。前一段时间使用SystemVerilog写了个测试平台,还曾经在自己的Space里面推荐过。不过现在又回到用SystemC的思路上来。首先说说SystemVerilog的问题:
    首先要肯定SystemVerilog是一个很好的语言,提供了对Verilog完美的支持,提供了随机化测试向量生成的功能,提供了面向对象的事务级测试编写环境。但是,它的语法显得有些混乱,同时当前EDA软件对其的支持还不够。
    语法混乱的问题恐怕源于其对Verilog的支持,就像C++是C的超集一样,SystemVerilog作为Verilog HDL的超集也继承了类似静态成员之类的硬件概念,导致一个变量有着静态变量和栈变量的区别。如果没有深刻理解,仿真时的行为会很出人意料。另外一个延伸的问题是对对象的支持让人难以理解。SystemVerilog支持类的建立,但是类和module的连接限制很多,很多问题让人难以掌控。比如如何在一个对象中驱动一个端口给一个硬件模块。当然,接口模块(interface)提供了这样的接口,但真的使用的时候,我的感觉是被软件的语法和编译规则束缚了。有时明明觉得很简洁的代码被改得面目全非,仅仅是为了通过软件的编译规则。
    也许上面的问题也正是另外一个问题的直接结果。无论Synopsys还是Cadence现在都不能支持整个SystemVerilog标准,而且这两个公司所支持的标准子集还不尽相同。这样的直接结果就是一个按照SystemVerilog标准写出来的测试程序很可能不能通过软件的编译。修改测试程序也许可以通过软件的编译,但是这种改变还要取决于最终的软件编译器。我们需要根据Cadence或者Synopsys做不同的修改。
    SystemC的好处在于,它的运行库真实而完整的提供了标准规定的所有特性。这样就保证了一段SystemC代码在任何一个编译器下都能被正确编译。不过他并不是完美的。它是一个C++库,和HDL的连接需要第三方软件的支持。

下面回到正题,如何用NC-Verilog来进行SystemC和Verilog HDL的混仿。这里我假设SystemC被用于编写测试,被测模块(DUT)是一个Verilog HDL模块 (VHDL也没有问题,不过相对复杂)。
1. 和在Verilog中实例化一个黑盒子模块一样,Verilog模块对于SystemC来说也是一个黑盒子,也需要一个黑盒子模块定义。比如一下一个简单模块

module dut ( clk, rstn, d_in, d_out);
input clk, rstn;
input [7:0] d_in;
output [7:0] d_out;
reg [7:0] d_out;
always @(posedge clk or negedge rstn)
if(!rstn)
  d_out <= 0;
else
  d_out <= d_in;
endmodule

它在SystemC中的黑盒子定义为:

File dut.h:
#include "systemc.h"

class dut : public ncsc_foreign_module {
public:
        sc_in < sc_logic > clk;
        sc_in < sc_logic > rstn;
        sc_in < sc_lv <8> > d_in;
        sc_out < sc_lv <8> > d_out;

        dut(
                sc_module_name nm
        ) : ncsc_foreign_module(nm)
                , clk("clk")
                , rstn("rstn")
                , d_in("d_in")
                , d_out("d_out")

        {
        }

        const char* hdl_name() const { return "dut"; }
};

File dut.cpp:
#include "dut.h"

可以看到,所有的端口都被翻译成sc_logic和sc_lv。dut本身是一个ncsc_foreign_module寄生类。这里ncsc_foreign_module就能让NC-Verilog知道这个模块并非SystemC类。生成这个黑盒子定义其实不需要写代码,NC-Verilog提供了一个命令来完成:

ncshell –import verilog –into systemc dut

不过运行之前需要先编译dut的Verilog模块。

2. 有了Verilog模块的黑盒子定义,剩下来的事情就好办了。该黑盒子定义可以作为普通的SystemC类使用于测试环境中。

3. 编译这个混仿的工程有点麻烦。我假设我有一个SystemC的测试环境代码test.h和test.cpp。以下就是在IUS 8.2中编译整个工程的脚本:

export NCSC_GCC=${CDS_LNX86_ROOT}/ius8.2/tools/systemc/gcc/bin/g++

CXXFLAG="-c -g -Wall"

#compile verilog files
ncvlog dut.v

#compile SystemC files
ncsc -compiler $NCSC_GCC -cflags "${CXXFLAG}" test.cpp
ncsc -compiler $NCSC_GCC -cflags “${CXXFLAG}" dut.cpp

#generate the shared library
${NCSC_GCC}  -Wl -shared -o sysc.so -L${CDS_LNX86_ROOT}/ius8.2/tools/lib
dut.o test.o
${CDS_LNX86_ROOT}/ius8.2/tools/systemc/lib/gnu/libncscCoSim_sh.so
${CDS_LNX86_ROOT}/ius8.2/tools/systemc/lib/gnu/libncscCoroutines_sh.so
${CDS_LNX86_ROOT}/ius8.2/tools/systemc/lib/gnu/libsystemc_sh.so

ncelab -timescale 1ns/1ps -access +rwc -loadsc sysc.so worklib.sc_main

首先编译所有的Verilog和SystemC文件。生成动态连接库的过程有点特别。SystemC代码参与NCSIM的仿真可以使用静态或者动态的两种方式。ncelab将所有的模块连接起来时,需要使用-loadsc参数读取生成的动态连接库。在这些都完成后,就可以使用

ncsim –tcl worklib.sc_main

来运行混仿。

以下是我对整个过程的一些建议:
1. 不要用ncsc_run脚本。尽管该脚本省去了以上编写脚本生成动态连接库的麻烦,但是脚本背后的过程还是一样的。如果不明白其内部过程,编译中出现的错误信息会很迷惑。第一次搭建仿真平台的时候使用如我所写的脚本也许能刚方便的找到编译错误。
2. 某些时候会报出找不到/lib/gnu下的so文件,这是因为IUS在安装之后没有正确运行配置程序。请联系你的软件管理员重新配置ISU软件。
3. 在所有的时候调用一个SystemC模块都应该把库的名称带上,比如sc_main应该写成worklib.sc_main。否则会出现进程终止的错误(也许是软件的bug)
4. 出现了软件内部错误往往也是SystemC代码导致的。所以ncsc编译的时候应该加上-g参数,方便生成调试信息。无论是ncelab还是ncsim其实都可以用gdb来调试。实在没有办法的时候不妨一试。
5. 建议在SystemC内部使用sc_uint类型代替sc_lv。sc_uint为bool逻辑,而sc_lv为4值逻辑(0, 1, Z, X)。在SystemC中使用4值逻辑有时会带来很可笑的结果,比如读到了X而导致仿真中止。读取一个sc_lv或者sc_logic请这么做

rd_value = versig.read().is_01() ? versig.read() : 0;

这样就能防止出现X态的问题。
6. 读入sdf文件也许有点小麻烦。我的建议是在Verilog那一端写一个顶层模块,连接所有的端口并读入sdf文件。
7. 用GUI方式仿真在我这里总是失败,我猜可能是我少连接了一些库。有解决办法的人请告诉我。
8. 使用TLM 2.0的话需要连接一些其他的库,具体请参阅文档。
9. IUS中关于SystemC的文档:doc/ncscsim 和doc/ncscref

在Linux上安装无内核支持的Xilinx USB Cable

Xilinx自带的USB Cable驱动程序需要安装windrvr驱动模块,其过程中需要根据内核代码重新编译驱动。而这个重新编译的过程在很多使用最新内核的Linux上失败,特别是使用2.6.18以上内核版本的Linux。显然我们不可能降级内核来安装一个驱动程序。不过幸运的是,外国的Geek们借助于libusb找到了一个不用重新编译内核的方法。以防以后忘记,也为了遇到同样问题的兄弟们,我特地将这个安装过程翻译成中文。需要特别的感谢我们组内的助研Lilian Janin博士提供网站地址(我显然没有这么执着地去找一条非官方的解决办法)。英文的相关内容参看:
http://svenand.blogdrive.com/archive/55.html
http://www.rmdir.de/~michael/xilinx/

具体方法如下:
1. 安装libusb-dev开发包。在Fedora上可以 yum install libusb-devel
2. 下载usb-driver-HEAD驱动程序。
3. 解压缩该驱动程序,编译该驱动程序,生成libusb-driver.so动态连接库
4. 将libusb-driver.so拷贝到/usr/lib  (安装到默认的链接库目录)
5. 在shell的环境中使能该链接库 (在bash中,可以在.bashrc中加上 export LD_PRELOAD=/usr/lib/libusb-driver.so)
6. 在/etc/udev/rules.d文件夹中添加一个新的规则文件50-xilinx-usb-pav.rules
7. 在新的规则文件中加入一条新规则 ACTION=="add",BUS=="usb",SYSFS{idVendor}=="03fd",MODE="666" (在50-xilinx-usb-pav.rules 文件中写入这一行语句)
8. 重新启动udev服务 (sudo /etc/init.d/udev restart)(也可能是其他的命令或者其他的位置,取决于Linux的版本)
9. 连接USB Cable并使用/sbin/lsusb查看所有的usb设备,如果有
    Bus 002 Device 002: ID 03fd:0008 Xilinx, Inc.
    或者类似的设备(有Xilinx, Inc)说明设备被识别并可工作了
10. 在ISE中使用该Cable还需fxload软件包 yum install fxload

如果一切顺利,现在USB Cable的连接灯应该已经亮了。如果还是有问题,就需要采取一些其他的特别操作。请参看http://svenand.blogdrive.com/archive/55.html

异步时序电路研究小组与相关学术会议

该列表将会在douban不断更新(http://www.douban.com/group/topic/6590845/
 
—————————————
学术会议:
—————————————
* ACSD : International Conference on Application of Concurrency to System Design
http://www.informatik.uni-trier.de/~ley/db/conf/acsd/index.html
 
* ASYNC : The International Symposium on Asynchronous Circuits and Systems
http://www.informatik.uni-trier.de/~ley/db/conf/async/index.html
 
 
* UK-ASYNC forum : The UK Asynchronous Forum
http://intranet.cs.man.ac.uk/apt/async/events/ukforum.html
 
—————————————
研究小组:
—————————————
* Columbia : Department of Computer Science, Columbia University, Steven M. Nowick.
Person http://www1.cs.columbia.edu/~nowick/
Paper  http://dblp.L3S.de/Authors/Steven_M._Nowick
 
* Caltech : Department of Computer Science, Caltech, Alain Martin.
Group http://www.async.caltech.edu/
Paper http://www.async.caltech.edu/publications.html
 
* DTU : Department of Informatics and Mathematical Modeling
System-on-Chip section, Technical University of Denmark, Jens Spars?.
Person http://www2.imm.dtu.dk/~jsp/
Paper http://www2.imm.dtu.dk/~jsp/pubs.html
 
* Edinburgh : School of Informatics, the University of Edinburgh, Aristides (Aris) Efthymiou.
Person http://homepages.inf.ed.ac.uk/aefthymi/
Paper http://homepages.inf.ed.ac.uk/aefthymi/pubs.html
 
* LIP6 : Architecture des Systèmes intégrés et Micro électronique, Laboratoire d’Informatique de Paris 6.
Group http://www-asim.lip6.fr/
Paper http://www-asim.lip6.fr/publications/
 
* Manchester : The Advanced Processor Technologies Group, School of Computer Science, The University of Manchester.
Group http://intranet.cs.man.ac.uk/apt/
Paper http://intranet.cs.man.ac.uk/apt/publications/
 
* Newcastle : Microelectronics System Design, School of Electrical, Electronic and Computer Engineering, Newcastle University.
Group http://async.org.uk/
TechRpt http://async.org.uk/tr.html
 
* NCU : Department of Computer Science, The University of North Carolina at Chapel Hill, Montek Singh.
Person http://www.cs.unc.edu/~montek/
Paper http://www.cs.unc.edu/~montek/publications.html
 
* Politecnico di Torino : Micro-Electronics group, Department of Electronics, Politecnico di Torino, Luciano Lavagno.
Person http://polimage.polito.it/~lavagno
Paper  http://dblp.L3S.de/Authors/Luciano_Lavagno
 
* Southampton : The Electronic Systems and Devices (ESD) Research Group, Electronics and Computer Science, University of Southampton.
Group http://www.esd.ecs.soton.ac.uk/
http://www.esd.ecs.soton.ac.uk/pubs/
 
* Technion : Advanced Circuit Research Center, Department of Electrical Engineering, Technion-Israel Institute of Technology, Ran Ginosar.
Person http://www.ee.technion.ac.il/~ran/
Paper http://www.ee.technion.ac.il/~ran/publications.html
 
* UPC : Department of Software, Universitat Politècnica de Catalunya, Jordi Cortadella.
Person http://www.lsi.upc.edu/~jordicf/
Petrify http://www.lsi.upc.edu/~jordicf/petrify/
Paper http://www.lsi.upc.edu/~jordicf/Publications/publications.html
 
* USC : CAD/VLSI Group, Electrical Engineering Systems,  University of Southern California, Peter A. Beerel.
Person http://jungfrau.usc.edu/new/people/beerel/index.html
Paper http://jungfrau.usc.edu/new/publications.htm
 
* UU : Myers Research Group, Electrical and Computer Engineering, University of Utah, Chris J. Myers.
Person http://www.async.ece.utah.edu/~myers/
Paper http://www.async.ece.utah.edu/publications/index.html
 
* UU : Electrical and Computer Engineering, University of Utah, Ken Stevens.
Person http://www.kdstevens.com/stevens/
Paper http://dblp.L3S.de/Authors/Kenneth_S._Stevens

NoC related conferences, journals and groups

  该列表会在douban不断更新(http://www.douban.com/group/topic/2837287/

      ——Conferences——
  * NOCS : International Symposium on Networks-on-Chip : http://async.org.uk/nocs2008/
  * DAC : ACM/IEEE Design Automation Conference : http://www.dac.com/45th/index.aspx
  * HiPEAC : International Conference on High Performance and Embedded Architectures and Compilers : http://www.hipeac.net/conference/
  * DATE : Design, Automation & Test in Europe Conference & Exhibition : http://www.date-conference.com/
  * NanoNet : International Conference on Nano-Networks and Workshops : http://www.nanonets.org/
  * CODES+ISSS : IEEE/ACM/IFIP international conference on Hardware/software codesign and system synthesis : http://www.codes-isss.org/
  * FPL : International Conference on Field Programmable Logic and Applications : http://www.kip.uni-heidelberg.de/fpl08/cms/website.php
  * ICCAD : IEEE/ACM International Conference on Computer-Aided Design : http://iccad2008.com/html-1/index.html
  * ASYNC : International Symposium on Asynchronous Circuits and Systems : http://async.org.uk/async2008/
  * NORCHIP : http://www.norchip.org/
  
  ——Journals——
  * IEEE Micro : http://www.computer.org/portal/site/micro/index.jsp
  * IEEE Design and Test of Computers : http://www.computer.org/dt
  * IEE Computer and Digital Techniques : http://www.ietdl.org/IET-CDT
  * Journal of Systems Architecture : http://www.elsevier.com/locate/sysarc
  * IEEE Circuits and Systems Magazine : http://www.ieee.org/organizations/pubs/magazines/CASM.htm
  
  ——Groups——
  * Israel Institute of Technology (Technion) : QNoC Project
  * Newcastle University : Alex Yakovlev
  * Royal Institute of Technology in Stockholm (KTH) : Nostrum Project
  * Stanford University : William J. Dally
  * University of Cambridge, UK : Simon Moore
  * University of Manchester, UK : Advanced Processor Technologies Group (CHAIN)
  * University of Tampere, Finland : Jari Nurmi
  * Carnegie Mellon University : Radu Marculescu
  * Technical University of Denmark : Jens Sparsø
  * Universidad Politecnica de Valencia : Jose Duato Marín
  * University of Bologna, Italy : Davide Bertozzi
  * Informatica e Sistemistica : Luca Benini
  * Stanford University : Srinivasan Murali