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

一 背景

最近在拿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如言如下所示:

  1. module ISA_test (ISAadd, ISAdatain, ISAwrite,ISAread, ISAdataout, regout);  
  2. input [11:0] ISAadd ;  
  3. input [7:0]  ISAdatain ;  
  4. output [7:0]  ISAdataout;  
  5. input ISAwrite ;   
  6. input ISAread ;  
  7. output[7:0] regout;  
  8. reg [7:0] ISAdataout;  
  9. parameter readdata = 8'hAA ;  
  10.   
  11. //assign regout = ISAbuf;     
  12. //(*noprune*) reg  [7:0] ISAbuf ;           //第a行  
  13. // reg [7:0] ISAbuf /*synthesis noprune*/ ; //第b行  
  14. reg  [7:0] ISAbuf ;           //第c行  
  15. always @(posedge ISAwrite)   
  16. begin  
  17.     if(ISAadd == 12'h307)  
  18.     begin  
  19.         ISAbuf <= ISAdatain;    //将输入总线的数据存入ISAbuf寄存器 第e行          
  20.         //ISAbuf <= ISAbuf+1;   //做加法操作      第f行  
  21. end  
  22. nd  
  23. endmodule  

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

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

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

图1:综合图

于是我查了一些资料,于是我增加了第a行(第a或者b行任选一,都是Quartus防止被优化)。然后重新综合,发现结果仍然如上图1所示结果,寄存器仍然被优化掉了。)

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

  1. module blog_test (ISAadd, ISAdatain, ISAwrite,ISAread, ISAdataout, regout);  
  2. input [11:0] ISAadd ;  
  3. input [7:0]  ISAdatain ;  
  4. output [7:0]  ISAdataout;  
  5. input ISAwrite ;   
  6. input ISAread ;  
  7. output[7:0] regout;  
  8. reg [7:0] ISAdataout;  
  9.   
  10. parameter readdata = 8'hAA ;  
  11.   
  12. //assign regout = ISAbuf;                 
  13. (*noprune*) reg  [7:0] ISAbuf ;           //第a行  
  14. // reg [7:0] ISAbuf /*synthesis noprune*/ ; //第b行  
  15. //reg  [7:0] ISAbuf ;             //第c行  
  16. always @(posedge ISAwrite)   
  17. begin  
  18.     if(ISAadd == 12'h307)  
  19.     begin  
  20.         //ISAbuf <= ISAdatain;    //将输入总线的数据存入ISAbuf寄存器 第e行        
  21.         ISAbuf <= ISAbuf+1;   //做加法操作        第f行  
  22.     end  
  23. end  
  24. endmodule  
永不止步步 发表于04-05 10:58 浏览1872次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67402个|学分:254175个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号