一 背景
最近在拿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
- nd
- endmodule
所有带注释的都是后来为了各种测试后加上的,最初的程序是没有带//的程序。大意是,我通过UBUNTU的驱动程序向寄存器ISAbuf写进一个数据。在原始程序下,当我想用signaltap观测ISAbuf寄存器是否存进了我用驱动程序写进的数时,signaltap找不到ISAbuf寄存器选项,于是无法观测,只能观测ISAdatain总线。
四 问题的一些分析和解决办法
上网查资料发现是因为没有带输出的reg型变量,是会被QUARTUS综合优化掉的。我于是查看QUARTUS综合结果如下图,发现确实没生成寄存器ISAbuf。
图1:综合图
于是我查了一些资料,于是我增加了第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