verilator常用基础知识
目录
- 预学习阶段
- 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时刻开始并发执行,且每个块执行是各自独立的,一本在块中使用begin
和end
定义范围域
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常用基础知识相关推荐
- 网络服务器最基本的是文件,你可能想知道的15个网络常用基础知识
原标题:你可能想知道的15个网络常用基础知识 网络是一个复杂的系统,涉及知识很多.现在腾正小超人给大家分享15个常用的网络基础知识: 1) 如何查看本机所开端口 用netstat -a -n命令查看! ...
- Swift常用基础知识(二)
Swift常用基础知识(一) 函数式编程 函数合成 func add1(_ v1: Int, _ v2: Int) -> Int { v1 + v2 }func currying<A, B ...
- Linux常用基础知识必备三之常用指令及操作
Linux常用基础知识必备三之常用指令及操作 1.vi和vim vi如何使用 vi几种模式下的操作指令 命令模式进入编辑模式 命令模式下的快捷键 底行模式(指按了esc键之后输入按键:后出现) 字符串 ...
- HTML和CSS的常用基础知识笔记
HTML基础知识 标题标签: <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> <h4& ...
- C#常用基础知识总结(B/S和C/S的异同属于个人整理)
转载自"IT弄你"的论坛帖C#基础知识 概念:.net与c# .net/dontnet:一般指.net framework框架,一种平台,一种技术 c#(charp):一种编程语言 ...
- 30分钟搞定ES6常用基础知识
ES6基础智商划重点 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值 ...
- 实施、运维常用基础知识(适用小白入门)
Linux 基础命令 软件包管理 压缩和解压缩 远程连接 文件操作 花式读(文件) 进程操作 Linux信息 系统服务 基础命令 TAB键---自动补全 管道符(|):将前一个命令的输出作为下一个命令 ...
- 前端HTML5常用基础知识总结
目录 一: 初识HTML 二:常见网页标签 2.1.标题标签 h1-h6 2.2.段落和换行标签 2.3.文本格式化标签 2.4.div和span标签 2.5.图像标签和路径 2.6.超链接标签 2. ...
- C++常用基础知识—STL库(1)
本文介绍C++常用的STL库知识,常用的函数及其用法,为备战C++编程比赛的朋友及对STL库函数应用时的快速查找提供方便. 后续还会继续更新,请大家多多支持!!! STL简介 顺序性容器 2.1 C+ ...
最新文章
- 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
- 域控制器服务器端和客户端设置
- android Hander Service 广播的综合使用案例
- Java实现图的深度和广度优先遍历算法
- Spring mvc 注解@ResponseBody 返回内容编码问题
- boost::geometry模块实现递归多边形线性区域的测试程序
- 【C++学习笔记一】C++类和对象详解
- git学习(四):理解git暂存区(stage)
- Intelli IDEA 快捷键操作,咱来点不一样的
- 在Eclipse中,如何将项目中的src/main/java目录设置为源代码包?
- console.log()中的运算与打印事件
- word转pdf转换器2015注册码
- 简单人物画像_超级简单人物素描画图片精选
- kaminari分页插件的使用
- 移动端图形化报表界面设计_移动端报表设计-帆软
- APP端测试常见的功能点
- 项目管理图表有哪些 这5种一定要知道
- 小试爬虫之豆瓣电影TOP250
- 机器学习算法工程师面试学习经验
- Java的socket连接以及string字符串长度过长解决