新浪博客

基于SMIC 0.18 um工艺的浮点FFT芯片的设计(一)

2017-02-17 16:01阅读:
不谈写代码,只简单介绍一下一些EDA的使用。
一、必要的库文件
首先,需要利用Artisan提供的SMIC 0.18um工艺的Memory Compiler生成dual-port SRAMdiffusion ROMSRAM用于FFT芯片的数据缓存,而ROM则是用来存放FFT运算中用到的旋转因子。而要使用Memory Compiler,就要使用Simics虚拟SPARC架构,运行Solaris 10操作系统,通过共享文件夹进行文件的传输。
关于SimicsSolaris的安装、破解和使用,请参考eetop上面的资料:
http://bbs.eetop.cn/thread-463116-1-1.html



由于我们使用的是单精度浮点数,根据IEEE 754标准,一个float变量占用32 bit的数据量;而芯片支持4096点的FFT运算,同时需要考虑到Complex Number复数运算。因此从设计上讲,需要SRAM的容量为:4096 * 2 * 32 bit = 256 Kbit。而如果直接生成4096 * 64 bitSRAM的话,铺开来的SRAM长宽比大约是0.25左右,不够协调;所以考虑将SRAM割成4部分,分别都是4096* 16 bitSRAM,定义成fft_data_ram_16b
进一步,ROM的面积相对于SRAM小很多,所以可以不用考虑长宽比的因素,直接生成一个4096 * 64 bitROM就行了。需要注意的是:VeriSiliconMemory Compiler生成ROM的时候要用到ROM code file(简称RCF),就是说,ROM的内容在generate的时候就要固定好。而RCF文件的format也很简单,就是简单的bit数据的列举。比如下面的RCF文件就是用来code一个2 * 32bitROM的:
10101010101010101010101010101010
01010101010101010101010101010101


很简单的RCF文件,其含义就是:ROM里面,地址为0的数据为0xAAAAAAAA;地址为1的数据为0x55555555;那么我们用来初始化旋转因子ROMRCF文件,其实就能用C语言来生成了。主要是考虑到C语言提供的file stream操作,强大的指针功能,可以帮助我们很方便的得到float类型变量的HEX十六进制表示。
float kr = (cos(i*2*PI/N));
float ki = (-sin(i*2*PI/N));
fprintf(fr,'X: XX;',i,
*((unsigned int *)(&kr)),*((unsigned int *)(&ki)));
unsigned int dr = *((unsigned int *)(&kr));
unsigned int di = *((unsigned int *)(&ki));
for(j=0;j<</span>32;++j){
fprintf(frb,'%d',(dr&0x80000000)!=0); dr <<= 1;
}
for(j=0;j<</span>32;++j){
fprintf(frb,'%d',(di&0x80000000)!=0); di <<= 1;
}
fprintf(frb,'');



在得到RCF文件后,保存成fft_widdle_data.dat,然后在Memory Compiler里面调用即可。最后再从Simics虚拟机中拷贝出来。
基于SMIC <wbr>0.18 <wbr>um工艺的浮点FFT芯片的设计(一)

观察一下得到的文件,主要是.lib.tlf.gds.lef.v.dat文件。如下表所示。
.lib文件:包含器件的logictiming信息,利用Synopsyslc_shell转换成.db
.tlf文件:
.gds & .lef文件:用来给Milkyway生成CELFRAM信息
.v & .dat文件:主要用来VCS进行simulation


首先,使用Python脚本,替换掉Artisan生成的lib文件中的USERLIB为对应的LIB名:
# 返回一个列表,其中包含在目录条目的名称(google翻译)
files = os.listdir('.')
for f in files:
if(os.path.isfile('./' + f)):
lines = open('./' + f).readlines() #打开文件,读入每一行
f_name = f.split('.')
lib_name = f_name[0]
if f_name[1]=='lib':
fp = open('./' + f,'w') #打开你要写得文件test2.txt
for s in lines:
# replace是替换,write是写入
fp.write( s.replace('US

我的更多文章

下载客户端阅读体验更佳

APP专享