棋子 · 3 天前

学会用代码绘制接口时序图

学点javascript,利用wavedrom快速构建硬件接口时序图

接口时序图绘制

做硬件设计,在做设计文档时总少不了接口时序图的绘制,之前曾写过两篇文章《VSCode:WaveForm在手,时序我有》《Markdown时序图绘制与表格绘制》如何绘制接口时序图,语法很简单,就几个关键字,用json来进行描述接口时序。

但人总是有惰性的,wavedrom虽然语法简单,但却很繁琐。之前曾为了绘制个别接口时序图不得已用python来来生成符合wavedrom的json文件,因为直接手写实在是太麻烦了,要一行行的调整。

就比如这个接口时序:

image.png

手写json是一件复杂的事情,最近重新看了下wavedrom的手册,了解到在wavedrom中是完全可以潜入code的。其嵌入的code代码为javascript。为了画接口时序图特意去看了下javascript基本语法(当然也用不到几个,没什么投入学习成本),而上面的图就是做练习时在Markdown中写的一点儿小代码:

wavedrom
{
  signal:[
    //clock generation
    function clockGen(clockName,repeatNum){
      var clock={name:clockName,wave:'p'+'.'.repeat(repeatNum-1)};
      return clock
    }('clk',16),
    //reset generation
    function resetGen(repeatNum,resetName,resetActiveLevel,resetAssertCycle){
      var reset={name:resetName,wave:''};
      reset.wave+=resetActiveLevel+''+'.'.repeat(resetAssertCycle-1)+(1-resetActiveLevel)+''+'.'.repeat(repeatNum-resetAssertCycle-1);
      return reset;
    }(16,'rst',1,5),
    //data generation
    function dataGen(cycleNum,startCycle,activeCycle,signalNum){
      var signalList=[]
      //signal name generation

      //valid generation
      signalList.push(
        {name:"valid",wave: '0'+ '.'.repeat(startCycle-1) + '1' + '.'.repeat(activeCycle-1) + '0'+'.'.repeat(cycleNum-startCycle-activeCycle-1)}
      );
      //data generation
      for(var signalIndex=0;signalIndex <signalNum;signalIndex++){
        signalList.push({name:"data"+signalIndex+'',wave:'',data:[]} )
        for(var cycleIndex=0;cycleIndex< cycleNum;cycleIndex++){
          signalList[signalIndex+1].wave+=(Math.floor(Math.random() * 8) + 2)+'';
          signalList[signalIndex+1].data.push((cycleIndex*signalNum+signalIndex)+'');
        }
      }
      signalList.unshift('bus');
      return signalList
    }(16,5,6,32)
  ]
}

代码解析

在这里使用的主要是javascript中的函数,通过函数定义来绘制时序图。 在函数中通过返回复合wavedrom结构的数据类型从而实现接口时序图的绘制。

时钟复位生成:

image.png

定义的时钟生成函数clockGen可以传入时钟信号名,时钟周期数,而复位生成函数resetGen则能够制定绘制多少周期的波形,复位信号名,复位电平,复位信号在哪一拍拉起,拉起多长时间等功能。

而bus总线则定义了函数dataGen:

image.png

在dataGen函数中通过两个for循环绘制bus总线中的data*信号,简单快捷。

不足之处

在wavedrom中可以通过定义javascript函数来快速的实现接口时序图绘制,但当前自己在使用时遇到的一点儿问题就是无法实现函数多次调用,像上面定义的函数clockGen只能在函数定义完之后直接传入('clk',16),而无法显示调用clockGen('clk',16),这样写就会报错,也就意味着一个函数只能调用一次,有指导怎么解决的小伙伴也欢迎私信。

END

作者:玉骐
文章来源:Spinal FPGA

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
19592
内容数
1303
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息