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如言如下所示:
所有带注释的都是后来为了各种测试后加上的,最初的程序是没有带//的程序。大意是,我通过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所示。
图二
五 总结
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行。有的情况下寄存器被优化掉了,比如程序没有对寄存器作任何操作,比如只对寄存器进行赋值的操作。 而有的情况下寄存器没被优化,如寄存器做计数器累加的情况。
最近在拿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行。有的情况下寄存器被优化掉了,比如程序没有对寄存器作任何操作,比如只对寄存器进行赋值的操作。 而有的情况下寄存器没被优化,如寄存器做计数器累加的情况。
相关文章推荐
- 【iCore、iCore2 双核心板】EPCS 实验(SPI Flash)(基于Verilog语言)
- 实验一 数据库定义与操作语言——数据库管理系统原理与设计
- 优化逻辑时序的几个办法——verilog语言
- 汇编语言实验1-实验平台、理解寄存器和内存
- 【iCore2双核心板】SRAM 读写实验(基于Verilog语言)
- 优化逻辑时序的几个办法——verilog语言
- 操作系统大型实验进展(11)-----C/C++语言在头文件中定义全局变量
- [汇编语言]sub命令得到的结果,在送入内存之前,是否保存在某个寄存器中
- C++小实验:在C++中实现类似于动态语言函数定义的宏
- verilog 语言[N:0]和[0:N]定义变量方法、比较大小以及不定值x用于if语句中的处理
- 汇编语言综合研究——使用寄存器
- 汇编语言的基础知识标识符和表达式的--复合内存变量的定义【4】
- 强类型、弱类型、静态、动态语言定义
- 如何分析一个网站的优化是否合格
- PHP class_exists 检查类是否已定义
- C语言实验——交换两个整数的值(顺序结构)
- 定义搜索引擎优化
- linux下c语言网络实验遇到的问题(1)
- php语言的优化
- 关于Verilog源文件是否可综合的一些说法