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 begin
  case(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_state
  Next = 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:sub1

  module 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:ROM

module program_count(...)
endmodule:program_count

module address_reg(...)
endmodule:address_reg

endmodule:chip

接口

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

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

interface main_bus;
  logic[15:0] data;
  logic[15:0] address;
  logic[7:0] bus_request;
endinterface

module top()
  main_bus bus() /* 接口实例化 */
  slave slave1(.bus(bus));
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统

ESP32-Web-Server 实战编程-使用文件系统建立强大的 web 系统 概述 在前述章节我们讲述了在网页端控制多个 GPIO 的案例。当程序开始变得复杂&#xff0c;让一些功能“自动起来”是一个好的选择。 在前面的示例中&#xff0c;我们需要在后端为每个前端代码的 URL 指定一个对…

类和对象——(2)类

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 只虽然夜晚很长&#xff0c;但天…

选择排序以及改进方案

选择排序以及改进方案 介绍&#xff1a; 选择排序是一种简单直观的排序算法&#xff0c;它的基本思想是在未排序序列中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放在已排序序列的末尾。选择排序的过程就像是每次从待排序的元素中选择最小的一个&…

C51--4G模块

EC03-DNC&#xff1a;4G通信模块 EC03-DNC 功能特点&#xff1a; 采用最新4G CAT1方案&#xff1b; 支持数据透明传输; 支持TCP、UDP 网络协议; 支持心跳包、注册包功能最大支持64个字节数&#xff1b; 支持MQTT协议&#xff0c;支持接入OneNet平台、百度云平台、阿里云平台的…

计网Lesson4 - 计算机组网模型

文章目录 计算机的连接方式1. 两台计算机的互联2. 多台计算机的互联&#xff08;旧式&#xff09;3. 多台计算机的互联 --- 集线器&#xff08;Hub&#xff09;4. 网桥5. 多台计算机的互联 --- 交换器&#xff08;Switch&#xff09; 计算机的连接方式 1. 两台计算机的互联 网…

ELK日志收集系统-filbeat

filebeat日志收集工具 elk&#xff1a;filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非java环境上收集日志…

Boot工程快速启动【Linux】

Boot工程快速启动【Linux】 在idea中打包cd usr/在local文件夹下mkdir app进入app文件夹把打包好的文件&#xff08;只上传其中的jar&#xff09;上传到app文件下检查linux中的Java版本&#xff0c;保证和项目的Java 版本保持一致运行 java -jar sp补全***.jar想看效果得查询当…

大模型的开源闭源

文章目录 开源&闭源开源和闭源的优劣势比较开源和闭源对大模型技术发展的影响开源与闭源的商业模式比较国内的大模型开源和闭源的现状和趋势 开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。 开源让技术共享&#xff0c;吸引了众…

爬虫如何确定HTTP代理IP是否符合自己业务需求?

HTTP代理在许多业务场景中发挥着关键作用&#xff0c;但要确保其能够满足业务需求&#xff0c;需要考虑多个方面的因素。今天我们一起看看&#xff0c;要如何判断HTTP代理是否适合自己的业务&#xff0c;以及在选择HTTP代理时需要考虑的综合因素。 1. 稳定性 稳定性是HTTP代理…

LangChain 14 SequencialChain链接不同的组件

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

计网Lesson3 - 计算机网络评价指标与封包解包

文章目录 计算机网络的性能指标1. 速率2. 带宽3. 吞吐量4. 时延5. 时延带宽积6. 往返时间7. 利用率8. 数据的解包和封包 计算机网络的术语实体![实体](https://img-blog.csdnimg.cn/direct/cbf4ca9ed5ab4df290b5a17b4642c6a1.png)协议服务 计算机网络的性能指标 1. 速率 数据…

MOSFET安全工作区域SOA

Safe Operating Area&#xff08;SOA&#xff09;即安全工作区&#xff1a;描述了当MOSFET工作在饱和区时可以处理的最大功率。超出安全工作区&#xff0c;则可能导致元件损坏。 SOA分为五个单独的界限&#xff0c;分别是RDS(on)限制 On Resistance&#xff08;RDS(on)&#…

算法通关第十三关-青铜挑战数学基础问题

数组元素积的符号 描述 : 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的…

大语言模型概述(二):基于亚马逊云科技的研究分析与实践

上期介绍了大语言模型的定义和发展历史&#xff0c;本期将分析基于亚马逊云科技的大语言模型相关研究方向&#xff0c;以及大语言模型的训练和构建优化。 大语言模型研究方向分析 Amazon Titan 2023 年 4 月&#xff0c;亚马逊云科技宣布推出 Amazon Titan 大语言模型。根据…

【SpringCloud系列】@FeignClient微服务轻舞者

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue3+java开发组队功能

Vue3java开发系统组队功能 需求分析 创建用户可以创建一个队伍&#xff08;一个房间队长&#xff09;&#xff0c;设置队伍人数&#xff0c;队伍名称&#xff08;标题&#xff09;&#xff0c;描述&#xff0c;超时时间。搜索加入&#xff0c;用户可以加入未满的队伍&#xf…

iconfont 使用彩色图标

1、下载iconfont到本地 2、全局安装 iconfont-tools npm install -g iconfont-tools 3、在iconfont解压目录下执行命令、一直回车 iconfont-tools 4、文件拷贝 执行完上述命令后会生成iconfont-weapp目录&#xff0c;将iconfont-weapp目录下的iconfont-weapp- icon.css文件…

ELK日志系统

&#xff08;一&#xff09;ELK 1、elk&#xff1a;是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成 2、E&#xff1a;ElasticSearch&#xff08;ES&#xff09;&#xff0c;是一个开源的&#xff0c;分布式的存储检索引擎&#xff08;索引型的非关系型数…

【开源】基于JAVA的城市桥梁道路管理系统

项目编号&#xff1a; S 025 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S025&#xff0c;文末获取源码。} 项目编号&#xff1a;S025&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…

大模型训练为什么用A100不用4090

这是一个好问题。先说结论&#xff0c;大模型的训练用 4090 是不行的&#xff0c;但推理&#xff08;inference/serving&#xff09;用 4090 不仅可行&#xff0c;在性价比上还能比 H100 稍高。4090 如果极致优化&#xff0c;性价比甚至可以达到 H100 的 2 倍。 事实上&#x…
最新文章