SystemVerilog 入门

文章目录

  • 包定义
  • SystemVerilog 数据类型
    • 结构体
  • SystemVerilog 过程块
  • 可嵌套模块
  • 接口

System Verilog 的优点

  • 提高了硬件建模能力、编码效率和抽象能力;RTL 级、系统级行为描述;

  • 增强了验证能力和为大规模复杂设计编写有效、无竞争测试程序的断言功能;

  • 相比 Verilog,有助于编写可综合硬件模型的特点:

    • 设计内部的封装通信和协议检查的接口;
    • 支持数据类型 int、用户自定义类型 typedef、枚举类型、类型转换;
    • 结构体、联合体、可共享的定义包 package
    • ++ -- += 赋值操作;
    • 显式过程块、priorityunique 修饰符;
    • 编程语句增强、通过引用传送到任务、函数和模块。

包定义

package ... endpackage,独立的声明空间,多个模块共享用户定义类型。包中可包含的可综合的结构:

  1. parameterlocalparam 常量定义;
  2. const 定义变量为常数;
  3. typedef 用户定义类型;
  4. automatic taskfunction 定义;
  5. 从其它包中 import 语句;
  6. 操作符重载定义。

包定义示例:

package definitions;parameter Version="1.1";typedef enum{ADD, SUB, MUL} opcodes_t;typedef struct{logic[31:0] a,b;opcodes_t opcode;} instruction_t;function automatic[31:0] multiplier(input[31:0] a,b);return a*b;endfunction
endpackage

包可独立放在一个文件中,用 include "包名" 引入。

如何引用包的内容?

  1. 用范围解析操作符 :: 直接引用;
module ALU
(input definitions::instruction_t IW,input logic clock,output logic[31:0] result);always_ff@(posedge clock)case(IW.opcode)definitions::ADD: result = IW.a + IW.b;definitions::SUB: result = IW.a - IW.b;definitions::MUL: result = definitions::multiplier(IW.a, IW.b);endcase
endmodule
  1. 将包中特定子项导入到模块或接口中;
module ALU
(input definitions::instruction_t IW,input logic clock,output logic[31:0] result);import definitions::ADD;
import definitions::SUB;
import definitions::MUL;
import definitions::multiplier;always_comb begincase(IW.opcode)ADD: result = IW.a + IW.b;SUB: result = IW.a - IW.b;MUL: result = multiplier(IW.a, IW.b);endcase
end
endmodule
  1. 用通配符 * 导入包中的子项到模块或接口中;
import definitions::*;
module tb_ALU;
instruction_t test_word;
logic[31:0] alu_out;
logic clock = 0;ALU dut(.IW(test_word), .result(alu_out), .clock(clock));
always #10 clock = ~clock;
initial begin@(negedge clock)test_word.a = 5;test_word.b = 7;test_word.opcode = ADD;@(negedge clock)$display("alu_out=%d(expected 12)", alu_out);$finish;
end
endmodule
  1. 将包中子项导入到 $unit 声明域中。

SystemVerilog 数据类型

  1. 增加 bit byte(8) int(32) shortint(16) longint(64) 变量类型;
  2. logic 定义变量,代替 reg,四态 0 1 Z X
  3. void 类型表示无存储;
  4. var 关键字表示对象是一个变量,比如 var logic[7:0] a
  5. 静态变量 static,自动变量 automatic
  6. 用户自定义类型 typedef
  7. 枚举数据类型 enum

以有限状态机为例说明枚举类型的使用:

module FSM(input logic clock, resetN, output logic[3:0] control);
enum logic[2:0] {WAITE=3'b001, LOAD=3'b010, READY=3'b100} State, Next;always@(posedge clock, negedge resetN)if(!resetN) State <= WAITE;else State <= Next;always_comb begin$display("\n Current state is %s(%b)", State.name, State);case(State)WAITE: Next = LOAD;LOAD; Next = READY;READY: Next = WAITE;endcase$display("\n Next state will be %s(%b)", Next.name, Next);
end
assign control = State;
endmodule

结构体

结构体 struct、联合体 union 数据类型,一种变量集表示。

结构体 struct 可以包括任何数据类型,可以集合不同类型和大小的变量、常量、自定义等:

struct{int a,b;opcode_t opcode;logic[23:0] address;bit error;
} Instruction_Word /* 结构体名 */

引用结构体:<结构体名>.<变量名>,如 Instruction_Word.address=32'h00ff00ff

SystemVerilog 过程块

  • always_comb:组合逻辑过程块,不需要指明敏感表
  • always_ff:时序逻辑过程块
  • always_latch:锁存逻辑过程块
  • unique case / if...else if...:只有且必须有一个条件匹配,否则报告运行错误
  • priority case / if...else if...:至少有一个条件匹配,多个匹配则执行第一个匹配分支
module traffic_light(output logic green_light, yellow_light, red_light,input sensor, input[15:0] green_downcnt, yellow_downcnt, input clock, resetN);
enum {RED, GREEN, YELLOW} State, Next;/* 时序电路 */
always_ff@(posedge clock, negedge resetN)if(!resetN) State <= RED;else State <= Next;/* 组合电路 */
always_comb begin:set_next_stateNext = State;unique case(State)RED: if(sensor) Next = GREEN;GREEN: if(green_downcnt==0) Next = YELLOW;YELLOW: if(yellow_downcnt==0) Next = RED;endcase
end:set_next_state/* 组合电路 */
always_comb begin:set_outputs{green_light, yellow_light, red_light} = 3'b000;unique case(State)RED: red_light = 1'b1;GREEN: green_light = 1'b1;YELLOW: yellow_light = 1'b1;endcase
end:set_outputs
endmodule

可嵌套模块

只能在父模块中实例化:

module ip_core(input logic clock);sub u1(.*);sub u2(.*);module sub1(...)...endmodule:sub1module sub2(...)...endmodule:sub2
endmodule:ip_core

例:用 SystemVerilog 实现以下结构图(主模块名 chip,地址位宽 32bits):

在这里插入图片描述

module chip(input_master_clock, master_reset);
logic[31:0] address, new_address, next_address;ROM u1(.address(address), .data(new_address), .clk(master_clock));program_count u2(.jump_address(new_address), .clock(master_clock), .reset_n(master_reset), .next_address(next_address));address_reg(.next_addr(next_address), .current_addr(address), .clk(master_clock), .rstN(master_reset));module ROM(output logic[31:0] data, input logic[31:0] address, input logic clk);
endmodule:ROMmodule program_count(...)
endmodule:program_countmodule address_reg(...)
endmodule:address_regendmodule:chip

接口

接口 interface ... endinterface 是一种功能强大的端口类型,可以简化复杂设计的建模和验证。可在 module 外单独定义。

支持多个信号组成一个端口,只需声明 1 次。接口中可以包括端口、任务 task、函数 function、过程块、程序块,也可参数化。

interface main_bus;logic[15:0] data;logic[15:0] address;logic[7:0] bus_request;
endinterfacemodule top()main_bus bus() /* 接口实例化 */slave slave1(.bus(bus));
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack如何设置兼容浏览器的范围​browserslist

Browserslist 是前端工程化不可或缺的工具&#xff0c;无论是处理 js 的 babel 还是处理 css 的 postcss&#xff0c;他们背后都有Browserslist 的身影。 一、如何查看查看所有浏览器和它的市场占有率 我们如何知道现在的浏览器那些被废弃、那些市场占有率高&#xff0c;可以…

mysql 性能排查

mysql 下常见遇到的问题有&#xff0c;mysql连接池耗尽&#xff0c;死锁、慢查、未提交的事务。等等我们可能需要看&#xff1b;我们想要查看的可能有 1.当前连接池连接了哪些客户端&#xff0c;进行了哪些操作 2.当前造成死锁的语句有哪些&#xff0c;是哪个客户端上的&#x…

dcat admin日志扩展 dcat-log-viewer 遇到的问题记录

扩展地址&#xff1a; https://github.com/duolabmeng6/dcat-log-viewer 问题描述&#xff1a; 使用很简单&#xff0c;直接安装扩展包&#xff0c;开启扩展就可以了&#xff0c;会自动生成菜单。 之前在别的系统用过&#xff0c;没问题&#xff0c;今天在一个新的系统用的时…

肖sir__mysql之单表练习题2__(2)

mysql之单表练习题 一.建表语句 create table grade(class int(4),chinese int(8),english int(4),math int(8),name varchar(20),age int(8),sid int(4)primary key auto_increment) DEFAULT charsetutf8; insert into grade(class,chinese,english,math,name,age)values(1833…

导致Facebook广告投放不成功的原因

Facebook是全球最大的社交媒体平台之一&#xff0c;也是众多跨境卖家选择广告投放的首选平台&#xff0c;但也还是会有很多跨境卖家在Facebook上推广效果不佳。那么本文小编讲一下导致Facebook广告投放不成功的原因以及相应解决方法。 1、受众群体太少 Facebook有个要求就是广告…

Programming Abstractions in C阅读笔记:p202-p234

《Programming Abstractions in C》学习第65天&#xff0c;p202-p234总结。 一、技术总结 完成第五章学习&#xff0c;第五章介绍递归在实际问题中的进一步应用&#xff0c;例如汉诺塔问题&#xff0c;数学中的排列问题&#xff0c;更有难度。使用递归解决问题时有时候需要借…

业务建模工具BPMN

目录 一、什么是BPMN 二、业务流程梳理的重要作用 三、BPMN的全图 四、BPMN的组成 1.BPMN的基本元素&#xff08;2.0&#xff09; 1.1 流对象&#xff08;Flow Objects&#xff09; 1.2 数据&#xff08;Data&#xff09; 1.3 连接对象&#xff08;Connecting Objects&a…

Leetcode—1670.设计前中后队列【中等】

2023每日刷题&#xff08;四十三&#xff09; Leetcode—1670.设计前中后队列 实现代码 erase(iterator position)在删除vector中的元素后&#xff0c;会将该元素的后面所有元素都往前挪一位。因此&#xff0c;原先的迭代器指向的元素就不是原来那个了&#xff0c;而是它的后…

0 NLP: 数据获取与EDA

0数据准备与分析 二分类任务&#xff0c;正负样本共计6W&#xff1b; 数据集下载 https://github.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets/online_shopping_10_cats/online_shopping_10_cats.zip 样本的分布 正负样本中评论字段的长度 &#xff0c;超过500的都…

命令模式 rust和java实现

文章目录 命令模式介绍javarustrust仓库 命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&…

git打tag和版本控制规范

我们在开发中经常会遇到要打tag的情况&#xff0c;但这个tag应该如何打呢&#xff1f;我不知道大家平时是怎么打的&#xff0c;但我基本就是从1.0.0开始进行往上递增&#xff0c;至于如何递增&#xff0c;基本凭感觉。今天同事新打了一个tag进行发版&#xff0c;然后被架构点名…

【esp32】可变时间的定时器中断的开启和关闭

前言 回忆若能下酒&#xff0c;往事便可作一场宿醉。醒来时&#xff0c;天依旧清亮&#xff0c;风仍然分明&#xff0c;而光阴的两岸&#xff0c;终究无法以一苇杭之。我知你心意。无须更多言语&#xff0c;我必与你相忘于江湖&#xff0c;以沧桑为饮&#xff0c;年华果腹&…