目录

  • 预学习阶段
    • verilator语法学习
    • 运行verilator官网的example
    • 电路设计举例

预学习阶段

verilator语法学习

常用网站:

  • OJ刷题网站
  • HDL基础知识
  • verilator官网

定义一个模块

module name(varible, ...);  // 定义一个模块// 模块逻辑
endmodule  // 模块结束

输入标识符:input,输出标识符:output

module name(input a,b,output c,d
);

赋值语句

assign x = y;

与、或、非、异或、同或

assign out = !in;  // 非门,C语言写法
assign out = ~in;assign out = a & b;  // 与门
assign out = a | b;  // 或门
assign out = a ^ b;  // 异或门
assign out = !(a ^ b);  // 同或门

线网型信号:wire,一般用来表示中间信号

wire a, b, c;

向量:将一组相关的信号用一个向量名称统一命名的方式

wire [7:0] w;  // 表示一个8bit的向量信号w

向量拼接:{},用于将向量进行拼接

d[2:0] = {a[0], b[1], c[1]};  // 表示d向量的第一位是a[0],第二位是b[1],第三位是c[1]

表示自定义bit的写法:n'bxxx..xxx:表示共有n位,每位为x,其中b表示的是binary

复制算子:取连续值的情况

{5{1'b1}} // 5'b11111
{2{a,b,c}} // The same as {a,b,c,a,b,c}
{3'd5, {2{3'd6}}} // 9'b101_110_110

模块调用:父模块调用子模块

module top_module(  // 父模块input  a,input     b,output    out
);mod_a mymod(  // 调用子模块 mymod为子模块实例化名称.in1 (a),  // 端口对应.in2 (b),  .out (out));
endmodulemodule mod_a (   // 子模块input   in1, input  in2, output     out
);
assign out = in1 & in2;
endmodule

always块语法格式

  • 组合逻辑电路:always@(),与assign语句等效

    • assign语句只能对一个信号进行赋值,always块内可对多个信号进行赋值
    • assign语句中被赋值信号为wire类型,always块内被赋值信号需定义为reg类型
    • always块内支持更加丰富的语法,如使用if…else..、case等适合实现交复杂的组合逻辑
module my (input a, input b, output reg out);always@(a, b) out = a & b;
endmodule
  • 时序逻辑电路:always@(posedge clk || negedge clk)

    • 阻塞赋值(如x = y;),该赋值方式只能用在过程块(如always@(*))内
    • 非阻塞赋值(如x <= y;),该赋值方式只能用在过程块内(如always@(posedge clk)

在设计Verilog模块时,请遵循以下原则:

  • 在组合逻辑的always块内采用阻塞赋值
  • 时序逻辑的always块内采用非阻塞赋值

if...else:控制语句,if语句用于过程块内部,其对应的电路是二选一的选择器

// 在`assign`中
assign out = (condition) ? x : y;
// 在`always`中
always@(*)beginif (condition) out = x;else if (condition) out = y;else out = z;end

case:条件语句

case (condition):a: b: c:
endcase

debug:调试,$display, $strobe, $monitor,使用$finish去结束这个仿真。

initial:从仿真0开始执行,在整个仿真过程中只执行一次;如果一个模块中包含了多个initial,则这些initial块从仿真0时刻开始并发执行,且每个块执行是各自独立的,一本在块中使用beginend定义范围域

initial begin//;end

暂时先学这么多,等后面有不懂的再回头看。

运行verilator官网的example

来看看verilator官方给的与C++交互的例子

mkdir test_our
cd test_ourcat >our.v <<'EOF'module our;  # 定义一个moduleinitial  # 定义一个initial块begin   # initial块的开始$display("Hello World"); # debug输出Hello World$finish; # debug完成end # initial块的结束endmodule  # our模块的结束
EOFcat >sim_main.cpp <<'EOF'#include "Vour.h"  # our.v被verilator编译成Vour.h#include "verilated.h"  # verialtor官方库int main(int argc, char** argv, char** env) {VerilatedContext* contextp = new VerilatedContext;  # verilator上下文指针contextp->commandArgs(argc, argv);  # 检查参数Vour* top = new Vour{contextp};  # 实例化our模块while (!contextp->gotFinish()) { # 一直到contextp仿真完成才退出top->eval(); # 更新电路状态}delete top;delete contextp;return 0;}
EOF

编译

verilator -Wall --cc --exe --build sim_main.cpp our.v
  • -Wall:让verilator执行强类型警告
  • --cc:得到C++输出
  • --exe:和wrapper文件一起,为了创建一个可执行文件
  • --build:让verilator能让自己执行

运行程序

./obj_dir/Vour
Hello World
- our.v:2: Verilog $finish

电路设计举例

处理器内部一般有一个PC寄存器,其中存储指令地址,正常运行过程中,PC的值会随时间增加,同时从指令寄存器中取出相应地址的指令,因此,在此实现处理器的取指令电路,包含两部分:PC模块、指令存储器

module pc_reg(input wire clk,input wire rst,output reg[5:0] pc,output reg ce
);always@(posedge clk) beginif (rst == 1'b1) begince <= 1'b0;  //  复位信号有效时,指令存储器使能信号无效end else begince <= 1'b1endendalways@(posedge clk) beginif (ce === 1'b0) beginpc <= 6'h00  // 指令存储器使能信号无效的时候,PC保持为0end else begin:pc <= pc + 1'b1  // 指令存储器使能信号有效的时候,PC在每个时钟+1endend
endmodule

verilator常用基础知识相关推荐

  1. 网络服务器最基本的是文件,你可能想知道的15个网络常用基础知识

    原标题:你可能想知道的15个网络常用基础知识 网络是一个复杂的系统,涉及知识很多.现在腾正小超人给大家分享15个常用的网络基础知识: 1) 如何查看本机所开端口 用netstat -a -n命令查看! ...

  2. Swift常用基础知识(二)

    Swift常用基础知识(一) 函数式编程 函数合成 func add1(_ v1: Int, _ v2: Int) -> Int { v1 + v2 }func currying<A, B ...

  3. Linux常用基础知识必备三之常用指令及操作

    Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...

  4. HTML和CSS的常用基础知识笔记

    HTML基础知识 标题标签: <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> <h4& ...

  5. C#常用基础知识总结(B/S和C/S的异同属于个人整理)

    转载自"IT弄你"的论坛帖C#基础知识 概念:.net与c# .net/dontnet:一般指.net framework框架,一种平台,一种技术 c#(charp):一种编程语言 ...

  6. 30分钟搞定ES6常用基础知识

    ES6基础智商划重点 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值 ...

  7. 实施、运维常用基础知识(适用小白入门)

    Linux 基础命令 软件包管理 压缩和解压缩 远程连接 文件操作 花式读(文件) 进程操作 Linux信息 系统服务 基础命令 TAB键---自动补全 管道符(|):将前一个命令的输出作为下一个命令 ...

  8. 前端HTML5常用基础知识总结

    目录 一: 初识HTML 二:常见网页标签 2.1.标题标签 h1-h6 2.2.段落和换行标签 2.3.文本格式化标签 2.4.div和span标签 2.5.图像标签和路径 2.6.超链接标签 2. ...

  9. C++常用基础知识—STL库(1)

    本文介绍C++常用的STL库知识,常用的函数及其用法,为备战C++编程比赛的朋友及对STL库函数应用时的快速查找提供方便. 后续还会继续更新,请大家多多支持!!! STL简介 顺序性容器 2.1 C+ ...

最新文章

  1. 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
  2. 域控制器服务器端和客户端设置
  3. android Hander Service 广播的综合使用案例
  4. Java实现图的深度和广度优先遍历算法
  5. Spring mvc 注解@ResponseBody 返回内容编码问题
  6. boost::geometry模块实现递归多边形线性区域的测试程序
  7. 【C++学习笔记一】C++类和对象详解
  8. git学习(四):理解git暂存区(stage)
  9. Intelli IDEA 快捷键操作,咱来点不一样的
  10. 在Eclipse中,如何将项目中的src/main/java目录设置为源代码包?
  11. console.log()中的运算与打印事件
  12. word转pdf转换器2015注册码
  13. 简单人物画像_超级简单人物素描画图片精选
  14. kaminari分页插件的使用
  15. 移动端图形化报表界面设计_移动端报表设计-帆软
  16. APP端测试常见的功能点
  17. 项目管理图表有哪些 这5种一定要知道
  18. 小试爬虫之豆瓣电影TOP250
  19. 机器学习算法工程师面试学习经验
  20. Java的socket连接以及string字符串长度过长解决

热门文章

  1. 关于虚拟机克隆后如何给克隆出来的虚拟机配ip
  2. 软件测试的定义、目的、原则、对象、测试与调试的区别
  3. 锁定计算机后点鼠标屏幕无反应,电脑鼠标点击桌面没有反应怎么办
  4. 微信公众号开发教程[012]-素材管理
  5. Vue组件通信(父子,祖孙)
  6. win10鼠标左键双击经常进不去文件夹【closed】
  7. Spring Cloud 微服务网关Gateway组件
  8. QCon-OPPO数据平台Cloud Lake 降本增效实践
  9. python用turtle画月亮_python之turtle使用:画一颗美美哒的树
  10. 产品思维训练 | 微信号终于能改了!