数字IC知识点总结(11)-VCS与Makefile仿真

首先我们来看Makefile是什么,引一段CSDN博客中的文段

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

简单来说就是我们使用一个make指令来代替先前的许多命令。

再来说VCS,什么是VCS呢?

下面说基础操作(最最基础的)

首先进入个人的目录中.v文件的路径下,对我们设计好的.v文件和tb文件首先进行编译,在终端Terminal中输入

vcs -sverilog -debug_all -timescale1ns/1ps led.v tb_led.v -l com.log 

这样对源代码RTL和testbench进行编译。其中led.v是设计文件,tb_led为测试文件。

跑完之后可以ls一下,看到在目录中出现了simv这个可执行文件

接下来输入指令来跑仿真

./simv -l sim.log

最后在dve中查看波形

dve -vpd vcdplus.vpd &

其中这个&表示后台运行。这样我们就打开了dve界面,在图形化界面中选择simv进行setup 、run 即可

但是这样太过于复杂了,所以我们选择使用Makefile。首先我们的的要做的make指令包括:

  • make all 进行上述所有的操作
  • make com 编译
  • make sim 运行sim
  • make run_dve 打开DVE
  • make clean 删除仿真中间文件

我们在终端中有Makefile的目录下只需要输入上述make指令即可完成操作

在此之前我们首先将.v tb文件的路径生成为file.list,在中断中输入

find -name "*.v" > file.list

打开file.list成这样

之后gvim makefile

all: com sim run_dve

com:
  vcs -sverilog -debug_all -timescale1ns/1ps led.v tb_led.v -l com.log

sim:
  ./simv -l sim.log

run_dve:
  dve -vpd vcdplus.vpd &

clean:
  rm -rf *.log csrc simv* *.key *.vpd DVEfile coverage *.vdb

保存后在终端中输入 make all 即可进行上述操作,出现的也和上面的都一样。最后做完可以make clean清除刚才仿真生成的文件,可以ls一下查看是否清除干净

#数字IC##笔记##FPGA工程师##电路设计工程师##芯片设计工程师#
全部评论
感谢楼主分享之前就是学ic的,可惜没干这行
1 回复 分享
发布于 2022-04-27 15:27

相关推荐

2025-12-24 15:25
已编辑
门头沟学院 前端工程师
是腾讯的csig腾讯云,前天晚上九点突然打电话约面,激动的通宵学了一晚上,第二天状态很差改了今天(以后再也不通宵学习了)感觉自己浪费了面试官一个半小时单纯手写+场景,无八股无项目无算法,打击真的很大,全是在面试官提醒的情况下完成的,自己技术方面真的还是有待提高,实力匹配不上大厂和已经面试的两个公司完全不一样,很注重编码能力和解决问题的能力,然而我这两个方面都很薄弱,面试官人很好很耐心的等我写完题目,遇到瓶颈也会提醒我,写不出题也会很耐心的跟我讲解好感动,到最后面试结束还安慰我打算把下周最后一场面试面完之后就不面啦,如果能去实习还是很开心,但是最重要的还是好好努力提高技术以下是面经第一题// 实现一个解析 url 参数的函数function parseUrl(urlStr) {// TODO}parseUrl('*********************************************');// 返回 {a: 1, b: 2, c: 3}追问:在链接里见过什么部分?用 hash 路由的话放在哪第二题// 考虑有一个异步任务要执行,返回 Promise,这个任务可能会失败,请实现 retry 方法,返回新方法,可以在失败后自动重试指定的次数。/*** 异步任务重试* @param task 要执行的异步任务* @param times 需要重试的次数,默认为 3 次*/function retry(task, times = 3) {// TODO: 请实现}// ---------------测试示例 ----------------// 原方法const request = async (data) => {// 模拟失败if (Math.random() < 0.7) {throw new Error('request failed');}const res = await fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST',body: JSON.stringify(data),});return res.json();}// 新的方法const requestWithRetry = retry(request);// 使用async function run() {const res = await requestWithRetry({ body: 'content' });console.log(res);}run();第三题就是给 retry 函数添加类型注释,用到泛型第四题:在组件库中将 Alert 用 api 的形式实现(应该就是 message 这个组件)怎么渲染到一个浮层里而不是原地渲染出来
不知道怎么取名字_:技术这个东西,太杂了,而且要下功夫的
查看5道真题和解析
点赞 评论 收藏
分享
评论
7
45
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务