软CPU验证


18

我目前正在使用Xilinx ISE和ISIM在VHDL中设计一个简单的CPU。设计部分进行得非常好,但是我似乎无法找到一种以一致的方式进行验证的方法。

现在,我有一个VHDL测试平台,可以随时更新以测试我正在处理的功能。这是非常临时的,它不能帮助我了解回归,也不能用于验证对规范/指令集的符合性。

我考虑过要开发一个广泛的测试套件,但是问题是,通用零件作为CPU的潜在状态与通用零件相比要大得多。

我正在寻找一种方法,使我能够以更可控的方式执行设计和测试。如果可以的话,可以使用某种“硬件TDD”。这样的事情存在吗?是否可以相对容易地应用于CPU等通用部件?

Answers:


16

CPU验证的整个问题非常庞大且困难。有些人就是以此为职业。我只给您概述...

  1. 编写一个汇编语言程序,以测试每条指令和每条指令的每个微小细节。例如,在测试ADD指令时,您可以同时使用正号,负号和每个数字(两次)来测试它。然后,您将测试进位标志,零标志等。CPU的其他特殊功能(例如分支预测等)在此测试中将有其自己的特殊部分。

  2. 使用C / C ++或类似的东西编写您的CPU模型。这是您的虚拟CPU。这也是您的“黄金CPU”,这意味着这是其他所有对象所比较的CPU。理想情况下,编写VHDL 的人与编写C / C ++模型的人不是同一个人。

  3. 编写/创建一个系统,在其中可以并行运行C / C ++模型和VHDL模型,并逐周期比较结果。从步骤1运行您的汇编程序,并确保两个模型匹配。

  4. 在随机的“指令”上运行两个模型。基本上,用随机数据填充“ ram”,然后像执行真实指令一样执行该随机数据。在VHDL和C / C ++模型上运行相同的随机数据,然后比较结果。此C / C ++模型将在某些工作站和/或服务器(而不是新的CPU本身)上运行。

  5. 设置一台或多台计算机,以永久永久重复步骤4。即使您的CPU已“完成”并且已经投入生产一年或更长时间,您仍将运行此测试。

  6. 每当有更多要模拟的东西时,请重复这些步骤。例如,您可以在路由后的VHDL上运行它,并提供可用的时间。

无法保证比较VHDL和C / C ++版本会捕获每个错误-确实没有更好的方法。在随机指令上测试CPU需要花费时间,但这也非常有用。唯一的替代方案是雇用很多人整天编写代码来测试CPU的不同部分-大型公司也这样做,但他们也从事随机数据工作。

对于编写VHDL代码的个人来说,通常只需执行步骤1。但是,如果您打算出售CPU,那么至少应该执行其他一些步骤(实际上,您应该全部完成这些步骤)。


很好的答案,谢谢!这很有道理。“金CPU”确实是难题的缺失部分,它使您可以在测试时进行逐周期验证。由于这主要是一个玩具项目,我想我将遵循最后一段的第一句话,并仅执行步骤1。但是知道我应该做的事情是无价的。
drxzcl 2012年

您还可以拥有一个金色的但非周期精确的C ++模型,该模型可以使其更加简单,因此更可能是正确的-例如,对于测试ALU功能很有用(“ 2 + 2 = 4和某些标志,不在乎什么时候”,而不是“在1个滴答声后2 + 2 = 4,在2个滴答声后标志”
Martin Thompson

另外,运行代码覆盖率(以检查您是否已完成所有工作)和测试覆盖率(以检查所有测试均已通过了pas和失败测试)
Martin Thompson

后续:使用“第一步”过程,我设法在汇编器中发现很多错误:P核心本身似乎还不错。
drxzcl 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.