写代码比较容易,稍微难点的是写注释和细节介绍,再难点的是写介绍文档(比我blog的文章,要简介明了还要争取面面俱到),最难就是写这BLOG文章的题目,题目看上去要像个题目,还要能简单概括,让知道你要写什么,还要重点突出。不过一种情况下题目是不重要的,就是认证的阅读完全文就是知道我到底想要墨迹什么了。
既然说到题目就围绕题目展开:
”在仿真环境使用两个UDP实体实现全栈仿真的方法“
这里说的仿真环境是icarvous verilog,使用的代码开发环境前期是notepad++写好每一个模块,后面使用quartus管理多模块代码。两个UDP实体说的咱们写好的UDP那实际是个模块,实例化后才叫做实体,才具备实际功能。全栈这个词是说咱们从以太网底层到MAC(包含ARP)到IP层(包含ICMP)到UDP层这是一套完整的实现,直接外接一个PHY芯片就可以实现UDP的发送和接收。
看图说话:
我不太愿意用软件画这类图,觉得只要能说明问题就行,但是确实让用户开得不是那么舒服。如果那位读者有空用软件做出来,发给我更新上去,将非常感谢。
这里实体A和B都是咱们之前组装好的UDP全栈,是同一个设计好的模块的两次不同的实例化。就好像面向对象编程里面的类和对象的概念。这样两个模块实际是用同一套代码,如果仿真时候场景是A发送数据包给B,没有出现在以太网总线上(最下面的两根线),我们就找A的问题,分析研究代码改成代码,如果正确出现在以太网总线上而B没有正确解析,我们就对B进行分析研究修改代码,这里要注意很关键的一点,由于A和B的实现都是用一套代码,对A和B的DEBUG实际是对这套代码不同功能进行DEBUG。
这样使用两个实体进行仿真好处是不用复杂的仿真测试向量,或者可以理解为:一个实体为另外一个实体产生测试向量。
这样也有一个问题就是如果模块的发送和接收部分算法都发生了同样的错误,这类错误可能是对协议的理解错误,比如ARP包的类型应该是0X0806结果我们收发部分都定义成了另外一个相同的数,这样在仿真中只看效果是无法发现错误。这个不足也是可以通过完整的分析以太网总线上几个电信的数据包来解决的(甚至可以使用wireshark抓几个数据包,设置相同的条件,看以太网总线的报文是否一致。也要注意wireshark抓到原始数据流是mac,缺少了7自己前导和一字节起始以及尾部4字节CRC校验)。当然对于以太网报文的正确性我们在之前分别对之前模块进行了测试,这部统调主要是将部分组成整体,调制他们之间的磨合,以及系统总体功能的实现。