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.mzph.cn/news/178664.shtml

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

相关文章

spring-framework-5.2.25.RELEASE源码环境搭建

环境准备 spring-framework-5.2.25.RELEASEIntelliJ IDEA 2022.3.1java version “11.0.20” 2023-07-18 LTSGradle 5.6.4java version “1.8.0_301” 下载spring-framework-5.2.25.RELEASE源码 git clone https://gitee.com/QQ952051088/spring.git cd spring gradlew buil…

[学习记录]Node event loop 总结流程图

文章目录 文章来源根据内容输出的流程图待处理遗留的问题参考 文章来源 详解JavaScript中的Event Loop&#xff08;事件循环&#xff09;机制 根据内容输出的流程图 待处理 这里从polling阶段开始 好像有些问题 遗留的问题 为什么“在I/O事件的回调中&#xff0c;setImmediate…

深度学习:全面了解深度学习-从理论到实践

深度学习&#xff1a;全面了解深度学习-从理论到实践 摘要&#xff1a;本文旨在为读者提供一份全面的深度学习指南&#xff0c;从基本概念到实际应用&#xff0c;从理论数学到实践技术&#xff0c;带领读者逐步深入了解这一领域。我们将一起探讨深度学习的历史、发展现状&#…

使用Tensorboard可视化 遇到无法访问此网站

问题&#xff1a; 使用Tensorboard可视化 遇到无法访问此网站 解决方法&#xff1a;后面加上服务器ip[参考] tensorboard --logdir目标目录 --hostxxx.xxx.xxx.xx

leetcode LCR24反转单链表

反转单链表 题目描述 题目分析 先来说迭代的思想&#xff1a; 上面next cur->next应该放在cur->next pre前面执行&#xff0c;这里笔误 再来说递归的思想&#xff1a; 题目代码 这个代码里面我加了我自己写的测试数据&#xff0c;自己可以去找对应的部分&#xff0c…

【功能测试】软件系统测试报告

1.引言 1.1.目的 本测试报告为 xxx 系统测试报告&#xff0c;本报告目的在于总结测试阶段的测试及测试结果分析&#xff0c;描述系统是否达到需求的目的。 本报告预期参考人员包括测试人员、测试部门经理、开发人员、项目管理人员等。 1.2.参考文档 《xxxx系统需求规格说明…

Java线程安全问题

什么是线程安全问题 用程序模拟线程安全问题 主线程 package com.itheima.d3;public class ThreadTest {public static void main(String[] args) {//1、创建一个账户对象&#xff0c;代表两个人的共享账户Accout acc new Accout("ICBC-110",100000);//2、创建两个…

Django回顾【二】

目录 一、Web框架 二、WSGI协议 三、 Django框架 1、MVC与MTV模型 2、Django的下载与使用 补充 3、启动django项目 补充 5、 Django请求生命周期 四、路由控制 1、路由是什么&#xff1f; 2、如何使用 3、path详细使用 4、re_path详细使用 5、反向解析 6、路由…

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

从零带你底层实现unordered_map (2)

&#x1f4af; 博客内容&#xff1a;从零带你实现unordered_map &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家…

figma 基础使用 —— 常用方法

一、 导入组件 分成两种方式 &#xff08;1&#xff09;离线的包导入&#xff08;iOS 常用组件.fig 直接拖拽到figma最近网页&#xff09; &#xff08;2&#xff09;在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键&#xff1a;shift R 三、插…

宿主Linux——KVM安装Windows7系统

KVM虚拟技术 KVM(Kernel-based Virtual Machine) 是基于Linux内核的开源虚拟化技术&#xff0c;在一台物理机上可同时运行多个虚拟系统。KVM使用硬件虚拟化扩展&#xff0c;例如Intel的VT和AMD的AMD-V&#xff0c;在性能方面更加高效&#xff0c;可提供更好的计算能力和响应速…

【从浅识到熟知Linux】基本指令之rmdir和rm

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;加油努力&#xff0c;这次写完真的真的真的要去干饭了&#xff01; 文章前言&#xff1a;本文介绍rmdir和rm指令用法并给出示例和截图。 文…

存在即合理,低代码的探索之路

目录 一、前言 二、低代码迅速流行的原因 三、稳定性和生产率的最佳实践 四、程序员用低代码开发应用有哪些益处&#xff1f; 1、提升开发价值 2、利于团队升级 一、前言 低代码的热潮至今未消停&#xff0c;从阿里钉钉跨平台协作方式&#xff0c;再到飞书上的审批流程&#xf…

房屋租赁出售经纪人入驻小程序平台

一款专为房屋中介开发的小程序平台&#xff0c;支持独立部署&#xff0c;源码交付&#xff0c;数据安全无忧。 核心功能&#xff1a;房屋出租、经纪人独立后台、分佣后台、楼盘展示、房型展示、在线咨询、地址位置配套设施展示。 程序已被很多房屋交易中介体验使用过&#x…

uni-app 离线打包安卓Apk(小白上手)

场景&#xff1a; 在使用uni-app 开发apk时&#xff0c;使用云打包有次数限制。尤其对于测试阶段是无比难受的&#xff0c;通常是浪费打包次数进行打包或者通过usb 给测试机更新开发环境&#xff0c;但这都是无比漫长的过程 尤其有多个测试机真的是噩梦般的存在 下载离线打包示…

【数据库】聊聊一颗B+树 可以存储多少数据

我们知道数据库使用的数据结构是B树&#xff0c;但是B树可以存储多少数据呢&#xff0c;在面试中也是经常会问的问题&#xff0c;所以我们从根上理解这个问题。 操作系统层面 数据都是存储在磁盘中的&#xff0c;而磁盘中的数据都是以最新单位扇区进行分割。一个扇区的大小是…

Python基础语法之学习数据转换

Python基础语法之学习数据转换 一、代码二、效果 一、代码 #数字转换成字符串 num_str str(11) print(type(num_str))#字符串转整数 numint("11") print(type(num),num)#浮点数转整数 float_num int(11.1) print(type(float_num),float_num)#整数转浮点数 num_flo…

OpenSSL 使用AES对文件加解密

AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它是目前广泛使用的加密算法之一。AES算法是由美国国家标准与技术研究院&#xff08;NIST&#xff09;于2001年发布的&#xff0c;它取代了原先的DES&#xff08;Data Encryption Stand…