2009年9月16日星期三

【转】关于verilog综合

转自:
http://hi.baidu.com/%B0%AE%B5%C4%BF%D5%BC%E4%B0%AE%B5%C4%CE%DD/blog/item/90993c03c27965074afb512e.html

一:基本
Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。

二:verilog语句结构到门级的映射
1、连续性赋值:assign
连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。

2、过程性赋值:
过程性赋值只出现在always语句中。

阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。

建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。

过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。

过程性赋值语句中的任何延时在综合时都将忽略。

建议同一个变量单一地使用阻塞或者非阻塞赋值。

3、逻辑操作符:
逻辑操作符对应于硬件中已有的逻辑门

4、算术操作符:
Verilog中将reg视为有符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。

5、进位:
通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
Wire [3:0] A,B;
Wire [4:0] C;
Assign C=A+B;
C的最高位用来存放进位。

6、关系运算符:
关系运算符:<,>,<=,>=
和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg ,net还是integer。

7、相等运算符:==,!=
注意:===和!==是不可综合的。
可以进行有符号或无符号操作,取决于数据类型

8、移位运算符:
左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。

9、部分选择:
部分选择索引必须是常量。

10、BIT选择:
BIT选择中的索引可以用变量,这样将综合成多路(复用)器。
11、敏感表:
Always过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确地映射到所用的门。

12、IF:
如果变量没有在IF语句的每个分支中进行赋值,将会产生latch。如果IF语句中产生了latch,则IF的条件中最好不要用到算术操作。Case语句类似。Case的条款可以是变量。

如果一个变量在同一个IF条件分支中先赎值然后读取,则不会产生latch。如果先读取,后赎值,则会产生latch。

13、循环:
只有for-loop语句是可以综合的。

14、设计时序电路时,建议变量在always语句中赋值,而在该always语句外使用,使综合时能准确地匹配。建议不要使用局部变量。

15、不能在多个always块中对同一个变量赎值

16、函数
函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为wire。

17、任务:
任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。

18、Z:
Z会综合成一个三态门,必须在条件语句中赋值

19、参数化设计:
优点:参数可重载,不需要多次定义模块

四:模块优化
1、资源共享:
当进程涉及到共用ALU时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常乘和加不共用ALU,乘除通常在其内部共用。

2、共用表达式:
如:C=A+B;
D=G+(A+B);
两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:D=G+C;这样只需两个加法器.

3、转移代码:
如循环语句中没有发生变化的语句移出循环.

4、避免latch:
两种方法:1、在每一个IF分支中对变量赋值。2、在每一个IF语句中都对变量赋初值。

5:模块:
综合生成的存储器如ROM或RAM不是一种好方法。最好用库自带的存储器模块。

五、验证:
1、敏感表:
在always语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。

2、异步复位:
建议不要在异步时对变量读取,即异步复位时,对信号赎以常数值。

verilog综合时序仿真出现X状态解决一例

软件版本:ISE webpack 11.1 + Synplify Pro 9.6.1 + Modelsim SE 6.5
CPLD:xilinx XC9500系列
 
 
模块代码:
module rs485_fiber(clk, rs485_rx,fiber_rx, fiber_sd, 
                    rs485_tx, rs485_en, fiber_tx, led_tx, led_rx);
                    
    output rs485_tx, rs485_en, fiber_tx, led_tx, led_rx; 
    input  clk, rs485_rx, fiber_rx, fiber_sd;
    
    reg [2:0] delay;
    
    initial begin
        delay = 3'b000;
    end
    
   assign rs485_tx = ~fiber_rx;
   assign fiber_tx = ~rs485_rx;
   assign led_tx = rs485_rx;
   assign led_rx = rs485_tx & fiber_sd; 
   assign rs485_en = (~delay[2]) | (~delay[1]) | (~delay[0]);
 
   always @ (posedge clk )         //always @ (posedge clk or posedge fiber_rx)
        
       if (fiber_rx == 1)  
           delay <= 0;                           
       else
           if (delay == 7)
               delay <= 7;
           else
               delay <= delay + 1;            
endmodule
 
顶层测试代码:
module RS485_fiber_t;
// Inputs
reg clk;
reg rs485_rx;
reg fiber_rx;
reg fiber_sd;
// Outputs
wire rs485_tx;
wire rs485_en;
wire fiber_tx;
wire led_tx;
wire led_rx;
// Instantiate the Unit Under Test (UUT)
rs485_fiber uut (
.clk(clk), 
.rs485_rx(rs485_rx), 
.fiber_rx(fiber_rx), 
.fiber_sd(fiber_sd), 
.rs485_tx(rs485_tx), 
.rs485_en(rs485_en), 
.fiber_tx(fiber_tx), 
.led_tx(led_tx), 
.led_rx(led_rx)
);
 
always #15 clk <= ~clk; //15ns反转一次
always #5000 fiber_rx <= ~fiber_rx;  //5us反转一次
 
initial begin
// Initialize Inputs
clk = 0;
rs485_rx = 1;  
fiber_rx = 0;  
fiber_sd = 1;  
// Wait 100 ns for global reset to finish
#100;
        
// Add stimulus here
end
      
endmodule
 
 
synplify综合RTL图:
 
 
modelsim 前仿真没有问题,后仿真结果有问题:
 
 
 
修改模块代码,always @ (posedge clk )   为always @ (posedge clk or posedge fiber_rx)   则综合RTL图为:
modelsim 前仿真没有问题,后仿真结果也没有问题:
 
 
原因分析:
 
从代码1可以看出,综合的RTL图中有多个控制端的多路数据选择器,如果多个控制端同时动作(由于延时等),可能会冲突,导致逻辑短路,从而形成X状态。
 
而代码2综合生成的RTL图中多个控制端的多路数据选择器被简化为单个控制端的两路选择器,则不会有该问题。

2009年9月14日星期一

ISE11.1 + Modelsim SE 6.5 CPLD开发环境搭建

最近搞CPLD,使用的是XILINX的XC9572,搭建环境的过程网上和书本上介绍的都不是很系统,过程还是相当麻烦的,现总结一下。
 
步骤:
1,下载ISE Webpack 11.1免费版
去XILINX的官方主页下载,(首先要注册下)有两种下载方式(1)使用网络安装版;下载一个80多M的安装文件,该程序会根据你的设置下载相应的文件安装,优点是不需下载所有安装文件,只下载需要安装的;但是安装过程中如果网络断线,机器重启就要从头开始;(2)现在全部安装文件,大约2.7G,下载说明中说浏览器会下载一个下载插件,该插件会保证下载文件的完整性,及断点下载,但是俺的FIREFOX一直没提示安装插件,那个插件GOOGLE了半天也没找到,最后使用FLASHGET就下载下来了。
 
2,下载Modelsim SE
网上找个PJ版就可以,CSDN上有个6.5版本可以。需要注意的是ISE 11.1的POST FIT仿真和编译XILINX库只支持Modelsim SE 6.2版本以上的。
 
3,安装
先安装Modelsim SE,再安装ISE 11.1,会自动找到Modelsim的安装目录,设置好。如果没有设置好,在ISE 11.1的菜单 设置中设置一下即可。
 
4,编译XILINX库
理论上在新建的工程中全部编译即可,但是实践发现有些库不会编译,后仿真时会提示找不到库。网上有很多方法编译库,最方便的方法还是在 ISE安装目录\ISE\bin\nt 中执行compxlibgui.exe 程序,按照提示,注意要选中所有库(包括FPGA),否则编译库不全面。编译完成即可。
 
需要注意的是:编译完成后,会自动更新ISE安装目录\ISE\bin\nt \unwrapped \modelsim.ini文件,添加进加载库的路径。新建工程仿真时,ISE会复制该文件到你的工程目录,从而从ISE中调用Modelsim仿真时,会读取工程目录下的配置。所以,如果你是先建的工程仿真出错后又编译的库,则需要执行菜单命令clean下你的工程,重新编译综合仿真,从而仿真时又复制一遍配置文件,否则仿真时会找不到库。
 
5,新建工程 添加测试文件
使用Verilog文件,加入你的模型,编译综合成功后;添加测试文件,要选择Verilog texture文件(必须注意啊!!),该测试文件会自动保护一个测试框架,在里面添加测试语句即可。
 
一定要注意:测试文件一定要选择Verilog texture文件,我一开始选择的Verilog源文件,结果,仿真都正常,前仿真没有问题,而后仿真有个波形就是出不来,最后发现是文件类型不对!!
 
6,仿真
在仿真界面下,右击设定仿真时间、精度等等参数,双击即可自动打开Modelsim仿真,在命令窗口输入run 30us即可仿真。
 
 
 
其他:
安装ISE Webpack 11.1 好像不会自动安装Modelsim XE软件版本,但是会有一个ISIM可以进行仿真。

2009年9月11日星期五

ISE MODELSIM小记(1)

ISE版本:ISE WEBPACK 11.1
MODELSIM SE 6.5

从ISE中调用MODELSIM SE 6.5,执行的配置文件是该工程目录下的modelsim.ini文件,该文件是建立该工程时从I:\XILINX\ISE11.1-WEBPACK\ISE\bin\nt\unwrapped\modelsim.ini复制过来的,而不是modelsim安装目录中的。

要编译XINLINX的库,则执行I:\XILINX\ISE11.1-WEBPACK\ISE\bin\nt目录下compxlibgui.ex程序,按提示进行即可;要进行布线后的仿真必须选中全部的,如果不选FPGA,默认好像不编译simprims_ver库等,都选择全部即可。在ISE工程中编译时也是不会全部编译。

[转帖]Modelsim se完全编译xilnx库的方法

转自:http://hi.baidu.com/yoman/blog/item/7ea0b38b8ce32e7e9e2fb4bc.html


什么是之前的老办法呢?

Modlesim 仿真库的建立:
将Modelsim根目录下的modelsim.ini的属性由只读改为可写。
新建一个文件夹,比如library(为叙述方便,把它放在modelsim的根目录下)。D:/modelsim/library.
启动Modelsim,选择[File]/[chang Directory],选择D:/modelsim/library.

选择[File]/[New]/[library]命令,弹出[Creat a New library],在[lihrary Name]中输入"simprims_ver",同时下一栏也自动输入"simprims_ver",单击OK。

在主窗口中选择[compile]/[Compile]命令,弹出[compile Source Files],在[Library]的下拉列表中选择"simprims_ver"在[查找范围]中选中[Xilinx/veriog/src /simprims]目录下的全部文件,单击complie进行编译。(这时可能会花你一些时间,耐心等待编译完毕)用同样的方法将unisims和 Xilinxcorelib三个仿真库进行编译。

这时在D:/modelsim/library 下就有以上三个仿真库。

总结步骤为a:建立库的放置路径b:对库进行编译c:对库进行映射。最后重新启动Modelsim可以在列表中看到建立的三个库。

那么这个办法明显是比较麻烦的。其实我们可以这样做;

1.
首先将modelsim.ini文件只读模式去掉,存档前面打对勾。
2.
在您安装ise的目录下,进入到bin\nt目录下,例如e:\ise6\bin\nt,确认有compxlib这个程序
3.
在cmd中运行compxlib -s mti_se -f all -l all -o e:\modeltech_6.0\xilinx_libs就可以了,e:\modeltech_6.0是我安装modelsim的目录,您可以作相应的更改。参数也可以按照您的要求作相应的更改。

这样就可以了。

需要注意的是,千万记住ise和modelsim的安装目录都不要出现空格,最好是直接安装在根目录下。

具体单独用modelsim进行behavioral model的方法是,打开modelsim,把你的代码和仿真代码文件加入,别忘了加入glbl.v文件。在哪里?自己找吧。然后编译,work库这些设置好后,命令行(modelsim里的)输入

vsim -L Xilinxcorelib_ver -L unisims_ver -L simprims_ver -lib work $yourtestname glbl

就可以了

2009年9月10日星期四

安装Modelsim SE 6.5 (Post installation 时停止)

今天安装Modelsim SE 6.5 ,总是在Post installation script 进行到50%时,停止。最好,停掉诺顿杀毒、360、天网防火墙后,安装成功!!