您的位置:首页 > 其它

verilog语言定义的“寄存器”是否被优化掉的实验

2013-12-17 18:50 232 查看
    一 背景

         最近在拿FPGA测试ISA总线的时序,同时ISA总线的master是用研华工控机pcm3362。工控机跑的UBUNTU系统,所以总体是在测试Linux环境下,驱动程序通过ISA总线和外接FPGA通信的问题。。。。由于是测试,需要一些观测工作,用Quartus的signaltap很方便。但是我发现许多寄存器signaltap里不能观察,设置signaltap信号时,就没有这些寄存器!那这些寄存器哪去了,要怎么才能测试出来? 

    二 实验的总体描述

        实验现场如图示,PC104通过手动连接线和FPGA主板连接起来。。。。FPGA是之前一块废弃空闲的板子,有一些空闲的I/O接口。二者之间的连接线为:ISA的8根数据线,ISA的20根地址总线,读控制线IOR,写控制线IOW。因为FPGA的I/O口不够用,所以只连接了低8位数据总线。

        程序设计上,通过UBUNTU下的驱动程序往地址线写数据,和从地址线读数据,来测试工作情况。FPGA简单设置二个地址,配合驱动程序来读写数据。用signaltap工具来观察各信号线的情况。图二为FPGA的顶层设计图。

       




     三 问题描述

      问题如一中所述,有的寄存器不能用signaltap观测。比如我的一段verilog如言如下所示:

module ISA_test (ISAadd, ISAdatain, ISAwrite,ISAread, ISAdataout, regout);
input [11:0] ISAadd ;
input [7:0]  ISAdatain ;
output [7:0]  ISAdataout;
input ISAwrite ;
input ISAread ;
output[7:0] regout;
reg [7:0] ISAdataout;
parameter readdata = 8'hAA ;

//assign regout = ISAbuf;
//(*noprune*) reg  [7:0] ISAbuf ;           //第a行
// reg [7:0] ISAbuf /*synthesis noprune*/ ; //第b行
reg  [7:0] ISAbuf ;		      //第c行
always @(posedge ISAwrite)
begin
if(ISAadd == 12'h307)
begin
ISAbuf <= ISAdatain;    //将输入总线的数据存入ISAbuf寄存器 第e行
//ISAbuf <= ISAbuf+1;   //做加法操作	    第f行
end
end
endmodule

     所有带注释的都是后来为了各种测试后加上的,最初的程序是没有带//的程序。大意是,我通过UBUNTU的驱动程序向寄存器ISAbuf写进一个数据。在原始程序下,当我想用signaltap观测ISAbuf寄存器是否存进了我用驱动程序写进的数时,signaltap找不到ISAbuf寄存器选项,于是无法观测,只能观测ISAdatain总线。

四  问题的一些分析和解决办法

      上网查资料发现是因为没有带输出的reg型变量,是会被QUARTUS综合优化掉的。我于是查看QUARTUS综合结果如下图,发现确实没生成寄存器ISAbuf。

     


                                            图1:综合图

      于是我查了一些资料,比如这个http://bbs.ednchina.com/BLOG_ARTICLE_1479777.HTM介绍的。于是我增加了第a行(第a或者b行任选一,都是Quartus防止被优化)。然后重新综合,发现结果仍然如上图1所示结果,寄存器仍然被优化掉了。)

      但是我仍然增加第a行,同时增加第f行,即是改成了如下的程序,综合结果即有寄存器ISAbuf了,如图2所示。

module blog_test (ISAadd, ISAdatain, ISAwrite,ISAread, ISAdataout, regout);
input [11:0] ISAadd ;
input [7:0]  ISAdatain ;
output [7:0]  ISAdataout;
input ISAwrite ;
input ISAread ;
output[7:0] regout;
reg [7:0] ISAdataout;

parameter readdata = 8'hAA ;

//assign regout = ISAbuf;
(*noprune*) reg  [7:0] ISAbuf ;           //第a行
// reg [7:0] ISAbuf /*synthesis noprune*/ ; //第b行
//reg  [7:0] ISAbuf ;		      //第c行
always @(posedge ISAwrite)
begin
if(ISAadd == 12'h307)
begin
//ISAbuf <= ISAdatain;    //将输入总线的数据存入ISAbuf寄存器 第e行
ISAbuf <= ISAbuf+1;   //做加法操作	    第f行
end
end
endmodule




                                                                                             图二

        五 总结

         1、对于带有输出的寄存器,是不会被优化掉。比如如下的程序,因为对寄存器用assign 接了输出regout,综合结果一般都是有寄存器(是肯定吗?)

module blog_test (ISAadd, ISAdatain, ISAwrite,ISAread, ISAdataout, regout);
input [11:0] ISAadd ;
input [7:0]  ISAdatain ;
output [7:0]  ISAdataout;
input ISAwrite ;
input ISAread ;
output[7:0] regout;
reg [7:0] ISAdataout;
parameter readdata = 8'hAA ;
reg  [7:0] ISAbuf ;
assign regout = ISAbuf ;    //it seems (*noprune*) does nothing . so regout = ISAbuf is a must to prevent the reg ISAbuf being optimized
always @(posedge ISAwrite)
begin
 if(ISAadd == 12'h307)
 begin
  ISAbuf <= ISAdatain;   
 end
end
endmodule
 

        2、对于没用assign或者<=赋给输出线的寄存器,分二种情况。

              第一种是,直接用reg testreg;  这样定义的寄存器,我测试的情况,寄存器都被优化掉了。

              第二种是,用了(*noprune*)或者/*synthesis noprune*/ 修饰的寄存器,如第a,b行。有的情况下寄存器被优化掉了,比如程序没有对寄存器作任何操作,比如只对寄存器进行赋值的操作。 而有的情况下寄存器没被优化,如寄存器做计数器累加的情况。

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: