首页 > 其他分享 >07-verilog & sytem verilog

07-verilog & sytem verilog

时间:2023-02-11 09:45:56浏览次数:36  
标签:sytem name initial st verilog 数组 logic bit 07

数据类型

二值逻辑变量

bit

  • 不赋值的时候,变量初始默认为0
  • x或z的值会转变为0
  • bit vector--bit矢量
bit [msb,lsb] variable_name = [initial_value]
  • 位宽:最高位为MSB,最低位为LSB
  • 不加任何描述,默认为unsigned,无符号数;表示有符号数需要加signed进行描述
  • 二值逻辑方便编译器的优化,效率更高,性能更好;但是不支持X和Z状态,不适用于RTL设计
    建立自己的仿真目录
  1. sim -- 仿真目录,放Makefile文件
  2. RTL -- 放RTL代码
  3. TB -- 放testbench
  • 使用tb文件进行仿真
module tb_test;

//定义变量
bit [3:0] a;
bit [4:0] b;


initial begin 
  a = 4'b0;
  b = -10;
  $display("a = %b",a);
  $display("b = %b",b);   // 10110 就是-10的补码
end
endmodule
  • begin end之间就是代码块
  • $display()就类似于print()函数
  • 使用Makefile进行测试
    Makefile文件
PLATFORM = LINUX64
FLIST := ../tb/tb_test.v
run:
  vcs -sverilog $(FLIST) -debug_all -P ${NOVAS_HOME}/share/PLI/VCS/LINUX64/novas.tab ${NOVAS_HOME}/share/PLI/VCS/LINUX64/pli.a -R -kdb -lca

wave:
  verdi -simflow -elab simv.daidir/kdb.elab++ -ssf sim.fsdb

clean:
  rm csrc novas_dump.log sim.fsdb simv simv.daidir ucli.key verdi_config_file novas.conf novas.rc verdiLog -rf

通过make run进行仿真

byte\shortint\int\longint

  • byte 8bit
  • shortint 16bit
  • int 32bit
  • longint 64bit
byte/shortint/int/longint variable_name = initial_value;
  • 默认都是有符号数,十进制数
  • 在前端设计中,这些数据类型是很少用到的
shortint temp = 256;
int sample,ref_data = -9876;
longint a,b;
longint unsigned testdata;

real & shortreal

  • real 等于C语言中的double,64bit
  • shortreal等于C语言中的float,32bit
  • 有符号数
  • 在验证覆盖率的时候会用到
real/shortreal variable_name = initial_value

real alpha = 100.0,coverage_result;
coverage_result = $get_coverage();
if(coverage_result = 100.0)...

四值逻辑变量

  • 四值逻辑:0,1,x,z
  • 如果不声明数值,变量的初始值为x;在进行设计的时候要避免x态传递

reg & logic

  • 四值逻辑在verilog中使用reg
reg [MSB:LSB] variable_name = initial_value;
  • 在SV中使用logic变量
logic [MSB.LSB] variable_name = initial_value;
  • reg和logic如果不用signed修饰,默认都是无符号数
  • logic继承了reg所有的特性,但是logic可以进行连续赋值,并且只有一个驱动;如果定义了一个reg变量,是不能用assign对其进行赋值的,但是logic变量可以用assign进行赋值
  • SV中:logic相当于reg和只有一个驱动的wire
module tb_test;

  wire [3:0] b;
  assign b = din_c;
  assign b = din_d;  //多个变量和b连接,多驱动,前提是cd具有推拉结构,OC,OD门
  
  wire [3:0] e;
  assign e = din_c;  //单驱动
endmodule

integer & time

  • integer,32bit有符号数
  • time,64bit无符号数
integer a = -100,b;
time current_time;
b = -a;
current_time = $time;// $time内置函数,返回仿真时间
if(current_time>100ms).....

枚举类型

将所有的情况列举出来,在状态机中使用的比较多,比如FSM有限状态机

  • 默认的数据类型是int
  • 初始化值是0
  • 可以使用枚举变量.name,显示枚举字符
enum [data_type] {named constants} enum_var1,enum_var2....;
module tb_test;
  enum bit[2:0] {IDLE=3'b001,TEST=3'b010,START=3'b100} st; //声明枚举类
  initial begin
    st = START;
    $display("st=%3b,name=%s",st,st.name); //st = 100,name=START
    $finish;
  end
endmodule
  • 使用typedef定义枚举类,方便例化
typedef enum [data_type] {named constants} enumtype;

typedef enum bit[2:0] {IDLE=3'b001,TEST=3'b010,START=3'b100} state; //定义枚举类

state st;   //例化一个枚举
initial begin
    st = START;
    $display("st=%3b,name=%s",st,st.name); //st = 100,name=START
    $finish;
  end
  • 不使用枚举类型还可以使用parameter
parameter variable_name = initial_value;

固定数组

type(数据类型 bit reg logic..) [位宽] array_name [size] = initial value;
  • 超过边界的写操作将被忽略
  • 超过边界的读操作:2值逻辑返回0,四值逻辑返回x
  • 支持多维数组
  • size--就是数组长度,index从0开始
integer number[5]; //定义一个长度为5的数组,不给初值

int b[2] = {3,7};

int c[2][3] = {{3,7,1},{5,1,9}};  //定义二维数组

byte d[7]][2] = {default:-1} ; 将所有元素的值都设置默认-1

bit [31:0] a[2][3] = c; //数组可以通过赋值的方式进行复制

for(int i = 0;i<$dimensions(a);)
  $display($size(a,i+1);) // 2,3,32 
  • $dimensions(数组)--返回数组的维数
  • $size(数组,数组维数)--返回给定数组维数数组元素的个数
module tb_test;
  logic [3:0] arr[3]; //定义长度为3的一维数组,每个元素为三位二进制数
  logic [3:0] arr2[3][3]; //定义二维数组
  initial begin
    arr[0] = 4'd2;
  end
endmodule

操作符和过程控制

语法规则

  • verilog和system verilog一样,都是大小写敏感的
  • 注释 // /**/
  • 数制格式
<size>'<base><number>
  • base-b表示2进制 ,d表示10进制,h表示16进制数
  • size是将数值转化为二进制数的时候的二进制位宽
32'h_beef_cafe

操作符

  • 一般在写除法的时候,是需要设计特定的算法进行计算的,硬件当中实现除法比较麻烦
  • 自增和自减用在for循环中使用的比较多
  • 逻辑运算&& || !
  • 逻辑等于,不等于 == !==
  • 逻辑与或非,在运算的时候需要参与运算的位数应该都是一位的
    左移和右移运算
module tb_test
  logic [3:0] a;

  initial begin 
    a = 4'b0011;
    b = a << 2;
    c = a >> 2;
    $display("b = %4b",b);   //左移低位补零,1100
    $display("c = %4b",c);   //右移,逻辑运算右移>>,高位补0,算术右移>>>,高位补符号位
  end
endmodule

标签:sytem,name,initial,st,verilog,数组,logic,bit,07
From: https://www.cnblogs.com/Icer-newer/p/17110752.html

相关文章

  • JAVA SpringBoot指定端口的几种方式/京鸿通信科技/www.kyohoon.com/15507589165
    SpringBoot指定端口的3种方式(亲测有效)@Value("${server.port}")privateStringport;@GetMapping("/hello")publicStringhello(){LocalDateTime......
  • 《分布式技术原理与算法解析》学习笔记Day07
    分布式锁什么是分布式锁?为了实现分布式互斥,我们需要在某个地方做个标记,这个标记是每个线程都可以看到,当标记不存在时可以设置该标记,当标记被设置后,其他线程只能等待拥有......
  • CentOS使用 yum 安装 Redis/京鸿通信科技/www.kyohoon.com/15507589165
    2.安装redisyuminstallredis3.查看redis状态安装完毕后需要启动#启动redisserviceredisstart#停止redisserviceredisstop#查看redis运行状态serviceredis......
  • 基于Verilog HDL的状态机描述方法
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • js基础笔记学习107-构造函数
     ......
  • kx00007-顺序表--插入函数
    一、顺序表结构定义#defineINIT_SIZE10 //顺序表初始容量typedefvoid(myOpFunType)(void*); //定义操作函数类型typedefintseqType; //定义顺序表元素类型......
  • 06-verilog基础语法
    Howtobuildandtestamoduleparameterdefparam修改参数Task&functionTaskFunctionfunction不可以调用task,因为task有时间信息task可以调用fun......
  • m基于FPGA的数字下变频verilog设计
    1.算法描述整个数字下变频的基本结构如下所示NCO使用CORDIC算法,CIC采用h结构的CIC滤波器,HBF采用复用结构的半带滤波器,而FIR则采用DA算法结构。这里,我们首先假设不考虑中......
  • 05-Verilog基础语法
    Verilog基础语法MixedModel(混合设计模型)SystemTasks(系统任务,系统函数)用随机数驱动验证格式化输出parameter参数化定义,比如设计一个四位的DFF和2位的DFF,位......
  • m基于FPGA的数字下变频verilog设计
    1.算法描述整个数字下变频的基本结构如下所示  NCO使用CORDIC算法,CIC采用h结构的CIC滤波器,HBF采用复用结构的半带滤波器,而FIR则采用DA算法结构。     这里,我......