学点javascript,利用wavedrom快速构建硬件接口时序图
接口时序图绘制
做硬件设计,在做设计文档时总少不了接口时序图的绘制,之前曾写过两篇文章《VSCode:WaveForm在手,时序我有》、《Markdown时序图绘制与表格绘制》如何绘制接口时序图,语法很简单,就几个关键字,用json来进行描述接口时序。
但人总是有惰性的,wavedrom虽然语法简单,但却很繁琐。之前曾为了绘制个别接口时序图不得已用python来来生成符合wavedrom的json文件,因为直接手写实在是太麻烦了,要一行行的调整。
就比如这个接口时序:
手写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结构的数据类型从而实现接口时序图的绘制。
时钟复位生成:
定义的时钟生成函数clockGen可以传入时钟信号名,时钟周期数,而复位生成函数resetGen则能够制定绘制多少周期的波形,复位信号名,复位电平,复位信号在哪一拍拉起,拉起多长时间等功能。
而bus总线则定义了函数dataGen:
在dataGen函数中通过两个for循环绘制bus总线中的data*信号,简单快捷。
不足之处
在wavedrom中可以通过定义javascript函数来快速的实现接口时序图绘制,但当前自己在使用时遇到的一点儿问题就是无法实现函数多次调用,像上面定义的函数clockGen只能在函数定义完之后直接传入('clk',16),而无法显示调用clockGen('clk',16),这样写就会报错,也就意味着一个函数只能调用一次,有指导怎么解决的小伙伴也欢迎私信。
END
作者:玉骐
文章来源:Spinal FPGA
推荐阅读
- RISC-V笔记——内存模型公理
- 闲聊内存模型(Memory Model)
- SystemVerilog中的time、stime、realtime的一些事儿
- 一致性协议挂死(hang)分析
- 芯片debug:awk结合grep获取读数据
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。