- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
测试与改错 编程大师说:“任何一个程序,无论它多么小,总存在着错误。” 初学者不相信大师的话,他问:“如果一个程序小得只执行一个简单的功能,那会怎样?” “这样的一个程序没有意义,”大师说,“但如果这样的程序存在的话,操作系统最后将失效,产生一个错误。” 但初学者不满足,他问:“如果操作系统不失效,那么会怎样?” “没有不失效的操作系统,”大师说,“但如果这样的操作系统存在的话,硬件最后将失效,产生一个错误。” 初学者仍不满足,再问:“如果硬件不失效,那么会怎样?” 大师长叹一声道:“没有不失效的硬件。但如果这样的硬件存在的话,用户就会想让那个程序做一件不同的事,这件事也是一个错误。” 没有错误的程序世间难求。 测试的阶段 设计验证 需求定义 设计输入 设计综合 设计实现 配置下载 综合结果分析 实际电路验证 静态时序分析 时序仿真 系统整合验证 功能仿真 测试的目的 测试的目的是为了发现尽可能多的缺陷。 测试总是先假设程序中存在缺陷,再通过仿真调试来发现并最终改正缺陷。理解这一点至关重要。 如果说测试的目的是为了说明程序中没有缺陷,那么测试人员就会向这个目标靠拢,因而下意识地选用一些不易暴露错误的测试示例。这样的测试是虚假的。 测试的真理 测试只能证明缺陷存在,而不能证明缺陷不存在。 这个真理告诉我们,对于一个复杂的系统而言,无论采取什么样的测试手段都不能证明缺陷已经不复存在。 在实践中,考虑到时间、费用等限制,不允许无休止地测试。 测试分工 开发人员应该执行“白盒”测试,即测试源程序的逻辑结构以及实现细节(“白盒”指看得见程序的内部结构)。 独立测试小组应该执行“黑盒”测试,即按照规格说明来测试程序是否符合要求(“黑盒”指看不见程序的内部结构)。 测试有助于提高软件的质量,但是提高软件的质量不能依赖于测试。软件的高质量是开发设计出来的,而不是靠测试修补出来的。 正确对待测试 一个错误自身也许很微小,但是程序存在错误这件事很严重。能否做好测试与改错工作,思想认识和办事态度是最关键的。 程序员应该把测试当成份内之事,不要依赖于外界的“黑盒测试”。 程序出了错误一定要改错,但是“编写优质无错”的程序才是根本的解决之道。 维护 软件维护是既费神又费钱的工作。 良好的编程风格意味着良好的可理解性,可以降低维护的代价。 如果测试与改错工作做得好,后期的维护代价就能降低。反之维护代价就升高。 清晰、正确和完备的文档能降低维护的代价,错误百出的文档还不如没有文档。 低效 大学科研机构里的软件维护工作恐怕是做得最差的了。几乎每一批新的研究生都会把毕业生留下的软件臭骂一通,然后全部推到重做。到他毕业该走时,就轮到别人骂他的工作了。如此轮回,最终没有什么成果留下。 如果希望软件系统能活下,必须要对它进行维护。 如果希望软件系统有效益,则必须设法降低维护的代价。 THE END 谢谢! FPGA开发流程及编程思想 简化的开发流程 需求定义 设计输入 设计综合 设计实现 配置下载 功能仿真 系统测试 设计验证 实际的开发流程 需求定义 设计输入 设计综合 设计实现 配置下载 综合结果分析 实际电路验证 静态时序分析 时序仿真 系统整合验证 功能仿真 需求定义 需求决定设计 “这个设计是做什么用的?” “要实现什么功能?” “有什么要注意的地方?” 需求是容易发生变更的 大师说过,没有哪个设计需求更改少于三次的,唯一一次只更改过两次需求的情况,是那个可怜的家伙在送第三次变更需求来的路上,被车给撞了。 你不能决定需求是否发生变更,但你可以做到当需求更改时,你所需要做出的调整最小。 设计输入 原理图输入(对大型设计很少使用) 硬件描述语言VerilogHDL,VHDL HDL语言是硬件描述语言,不是硬件设计语言 用硬件电路设计思想来编写HDL 先有鸡,还是先有蛋? always@(posedge clk) if(!rst_n) a = 8’b0; else a = a + 1’b1; ? 是因为,我们这样写了,a就会被综合成同步计数器; √ 还是因为,这样写a会被综合成同步计数器,我们才如上写。 你知道它们会综合成什么? 代码1: always @ (posedge clk) begin if (ce) b = {in, b[0:14]}; end assign out = b[15]; 代码2: reg [31:0] c[511:0] ; always @ ( posedge clk) begin addr_reg = addr; if (we) c[addr] = din; end assign out = c[
文档评论(0)