Chisel入门——在windows下vscode搭建|部署Scala2.13.3开发环境|用Chisel点亮FPGA小灯等实验

文章目录

  • 前言
    • Chisel介绍
  • 一、vscode搭建scala开发环境
    • 1.1 安装Scala官方插件
    • 1.2 创建hello_world.scala文件
    • 1.3 确认java的版本(博主使用的是1.8)
    • 1.4 下载Scala Windows版本的二进制文件
    • 1.5 配置环境变量
    • 1.6 交互模式测试一下
    • 1.7 vscode运行scala
  • 二、windows安装sbt
    • 2.1 下载sbt
    • 2.2 设置环境变量
    • 2.3 sbt配置
    • 2.4 设置阿里云镜像
    • 2.5 验证
  • 三、用Chisel点亮FPGA小灯
    • 3.1 参考文档
    • 3.2 得到Verilog文件
      • 1. 环境搭建
      • 2. 克隆项目
      • 3. 编译运行
      • 4. 生成Verilog文件
    • 3.3 上板验证
      • 1. 创建quartus项目
      • 2. 加入.v文件
      • 3. 绑定引脚
      • 4. 上板烧录
  • 四、在DE2-115开发板上重做Verilog实验
    • 4.1 流水灯
  • 总结
  • 参考


前言

由于verilog效率比较低下,重复劳动太多了QAQ
所以打算用近两年比较火的chisel进行开发。
于是先装一波环境,踩了一天的坑。

传统数字芯片的RTL设计采用Verilog语言为主,Chisel语言的全称是Constructing Harward in Scala Embeded Language,即在Scala语言中导入Chisel3库,即可使用Chisel语言。其特点是面向对象编程,可以方便地参数化定制硬件电路,加快设计流程。目前在RISC-V生态中应用较多,中科院计算所主持的培育下一代处理器设计人才的“一生一芯”项目也在极力推进该语言。

Chisel介绍

Chisel 是一种构建硬件描述语言(HDL)的高级编程语言,它允许硬件设计师以更抽象的方式编写代码,然后编译生成低级的硬件描述语言(通常是Verilog)代码,进而用于 FPGA 或 ASIC 的设计实现。Chisel 由加州大学伯克利分校的伯克利软件定义硬件(BSDH)项目开发,其主要目标是提高硬件设计的生产效率、可读性和可维护性。

概念:
Chisel 结合了现代软件工程的原理与硬件设计的实践,支持面向对象编程特性,如类、继承、多态等,同时也引入了静态类型和类型安全的概念,有助于在设计阶段捕捉错误。它利用Scala 语言作为基础,这意味着设计师可以利用Scala 强大的库和工具生态系统。Chisel 提供了一套丰富的数据类型和构造,使得设计者能够以高层次的抽象来描述数字电路,比如向量、内存、多路复用器等,并且支持参数化模块,便于设计复用和配置。

用途:

提高设计效率:Chisel 的高层抽象能力使得设计师可以更快地实现复杂的数字电路设计,减少手动编写底层 HDL 代码的工作量。
增强可读性和可维护性:通过使用高级语言特性,Chisel 设计的代码更加接近自然语言,易于阅读和理解,有利于团队协作和长期维护。
促进设计复用:Chisel 支持模块化和参数化设计,便于创建可配置的组件库,加速后续项目开发。
简化验证流程:Chisel 设计可以直接与验证框架(如Chisel Testers 2)集成,支持快速创建测试平台,加速设计验证过程。
教育和研究:Chisel 的高级特性降低了硬件设计的入门门槛,使其成为教学和研究的理想工具,特别是在计算机体系结构和并行计算领域。
综上所述,Chisel 作为一种现代化的硬件设计语言,极大地提升了硬件设计的抽象层次,促进了设计的灵活性、高效性和质量,是现代硬件设计和研究中的一个重要工具。

学习Chisel语法规则等可以在吃透Chisel语言吃透Chisel语言进行学习


一、vscode搭建scala开发环境

1.1 安装Scala官方插件

VS Code中安装插件,先安装 Scala Syntax (official),再安装 Scala (Metals)

(官方插件,有个语法高亮功能也挺香的)
在这里插入图片描述
在这里插入图片描述

1.2 创建hello_world.scala文件

在这里插入图片描述

代码如下:

object HelloWorld 
{    
	def main(args: Array[String]): Unit = {
	        println("Hello, world!")    
	        }
}

1.3 确认java的版本(博主使用的是1.8)

在这里插入图片描述

1.4 下载Scala Windows版本的二进制文件

下载链接:
https://downloads.lightbend.com/scala/2.13.3/scala-2.13.3.msi

在这里插入图片描述

双击进行安装,并一路 next
在这里插入图片描述

记住安装路径,等下配置环境变量需要用
博主的安装路径为:
在这里插入图片描述

1.5 配置环境变量

1.刚刚让记的那个 安装路径
在这里插入图片描述

在这里插入图片描述

2.PATH变量下再新增值
在这里插入图片描述在这里插入图片描述
至此 安装完毕

1.6 交互模式测试一下

在这里插入图片描述

至此 Scala开发环境搭建成功

1.7 vscode运行scala

在这里插入图片描述

二、windows安装sbt

2.1 下载sbt

官网:http://www.scala-sbt.org/download.html

无脑执行下一步即可,注意 记住安装位置 ,方便后续环境变量的配置
在这里插入图片描述

2.2 设置环境变量

#SBT_HOME 设置为sbt解压目录,例如:

SBT_HOME=C:\Programs\sbt;

添加到 系统变量 中:
在这里插入图片描述

添加到 path 中:
在这里插入图片描述
在这里插入图片描述

2.3 sbt配置

修改 sbt\conf\sbtconfig.txt 为以下内容:

# sbt configuration file for Windows
 
# Set the java args
 
#-mem 1024 was added in sbt.bat as default
 
-Xms1024m
-Xmx1024m
-Xss4M
-XX:ReservedCodeCacheSize=128m
 
# Set the extra sbt options
 
-Dsbt.log.format=true
-Dsbt.boot.directory=D:/SoftWare/scala-2.13.3/sbt/boot/
-Dsbt.global.base=D:/SoftWare/scala-2.13.3/sbt/.sbt
-Dsbt.ivy.home=D:/SoftWare/scala-2.13.3/sbt/.ivy2
-Dsbt.repository.config=D:/SoftWare/scala-2.13.3/sbt/conf/repo.properties
-Dsbt.override.build.repos=true

2.4 设置阿里云镜像

国内的网络环境复杂,阿里云还挺好用的,在 sbt\conf\ 下新建 repo.properties 文件,内容为:

[repositories]
    local
    aliyun-central: https://maven.aliyun.com/repository/central
    aliyun-public: https://maven.aliyun.com/repository/public
    jcenter: https://jcenter.bintray.com/
    repo1: https://repo1.maven.org/maven2/
    store_2: https://repo2.maven.org/maven2/
    aliyun-releases: https://maven.aliyun.com/repository/releases
    aliyun-apache-snapshots: https://maven.aliyun.com/repository/apache-snapshots
    aliyun-google: https://maven.aliyun.com/repository/google
    aliyun-jcenter: https://maven.aliyun.com/repository/jcenter
    aliyun-spring: https://maven.aliyun.com/repository/spring
    aliyun-spring-plugin: https://maven.aliyun.com/repository/spring-plugin
    sbt-plugin: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/
    sonatype: https://oss.sonatype.org/content/repositories/snapshots  
    typesafe: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
    typesafe2: https://repo.typesafe.com/typesafe/releases/
    atlassian: https://packages.atlassian.com/content/repositories/atlassian-public/
    spring-plugin: https://repo.spring.io/plugins-release/
    hortonworks: https://repo.hortonworks.com/content/repositories/releases/

2.5 验证

完成后打开cmd,输入 sbt,可能会有一段下载依赖包的过程,成功后会进入命令行,即sbt安装成功
在这里插入图片描述

退出方式:在命令框中输入 exit 即可退出:
在这里插入图片描述

三、用Chisel点亮FPGA小灯

3.1 参考文档

参考的chisel书为chisel-book,是一个PDF文档,

Chisel-book: https://wwu.lanzoue.com/isdim08x8x5i
在这里插入图片描述在这里插入图片描述

3.2 得到Verilog文件

1. 环境搭建

找到其中 WINDOWS开发环境搭建
在这里插入图片描述

OK,按着以上内容下载所需要的软件(前面我们已经配置好了环境)

question: 哪能找到一个Chisel例程?

OK,继续看这本书,这是本好书,Hello world例程书里有了,代码在Git

在这里插入图片描述

2. 克隆项目

继续找到了GIT上的chisel-examples.

OK 点击去GIT上 克隆下来

github:https://github.com/schoeberl/chisel-examples

在这里插入图片描述

好了,找到helloworld例程了。现在想想例程怎么编译?生成Verilog代码在哪?
书中3.7章节有写
在这里插入图片描述

3. 编译运行

书里只写了Chisel下的编译生成。至于下载到FPGA文档里说要自己动手,不在文档教程内了。

具体流程:

cmd命令下,

git clone https://github.com/schoeberl/chisel-examples.git
cd chisel-examples/hello-world/

执行编译 sbt run
在这里插入图片描述

第一次编译需要等待很长时间,然后显示成功。(因为我编译过了,所以第二次很快)。

Hello.scala

//点亮小灯
/*
 * This code is a minimal hardware described in Chisel.
 * 
 * Blinking LED: the FPGA version of Hello World
 */
// 
import chisel3._
// 
/**
 * The blinking LED component.
 */
// 
class Hello extends Module {
  val io = IO(new Bundle {
    val led = Output(UInt(1.W))
  })
  val CNT_MAX = (50000000 / 2 - 1).U
// 
  val cntReg = RegInit(0.U(32.W))
  val blkReg = RegInit(0.U(1.W))
// 
  cntReg := cntReg + 1.U
  when(cntReg === CNT_MAX) {
    cntReg := 0.U
    blkReg := ~blkReg
  }
  io.led := blkReg
}
// 
/**
 * An object extending App to generate the Verilog code.
 */
object Hello extends App {
  (new chisel3.stage.ChiselStage).emitVerilog(new Hello())
}

4. 生成Verilog文件

OK,现在找生成的Verilog,书中说是 Hello.v文件

在这里插入图片描述

生成的 Hello.v 文件:

module Hello(
  input   clock,
  input   reset,
  output  io_led
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
`endif // RANDOMIZE_REG_INIT
  reg [31:0] cntReg; // @[Hello.scala 23:23]
  reg  blkReg; // @[Hello.scala 24:23]
  wire [31:0] _cntReg_T_1 = cntReg + 32'h1; // @[Hello.scala 26:20]
  assign io_led = blkReg; // @[Hello.scala 31:10]
  always @(posedge clock) begin
    if (reset) begin // @[Hello.scala 23:23]
      cntReg <= 32'h0; // @[Hello.scala 23:23]
    end else if (cntReg == 32'h17d783f) begin // @[Hello.scala 27:28]
      cntReg <= 32'h0; // @[Hello.scala 28:12]
    end else begin
      cntReg <= _cntReg_T_1; // @[Hello.scala 26:10]
    end
    if (reset) begin // @[Hello.scala 24:23]
      blkReg <= 1'h0; // @[Hello.scala 24:23]
    end else if (cntReg == 32'h17d783f) begin // @[Hello.scala 27:28]
      blkReg <= ~blkReg; // @[Hello.scala 29:12]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  cntReg = _RAND_0[31:0];
  _RAND_1 = {1{`RANDOM}};
  blkReg = _RAND_1[0:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule

在这里插入图片描述

以及顶层文件 hello_top.v
在这里插入图片描述
hello_top.v

/* Minimal top level for the Chisel Hello World.
  Wire reset to 0. */

module hello_top(input clk, output led);

  wire h_io_led;
  wire res;

  assign led = h_io_led;
  assign res = 1'h0;
  Hello h(.clock(clk), .reset(res),
       .io_led( h_io_led ));
endmodule

在这里插入图片描述

3.3 上板验证

1. 创建quartus项目

板子型号为 EP4CE115F29C7

2. 加入.v文件

将生成的 Hello.v文件hello_top.v文件 添加到项目中,并设置hello_top.v为顶层文件
在这里插入图片描述

3. 绑定引脚

根据技术文档,led的引脚如下,任意选择一个led
在这里插入图片描述

绑定引脚
在这里插入图片描述

4. 上板烧录

实现效果:
在这里插入图片描述

四、在DE2-115开发板上重做Verilog实验

4.1 流水灯

修改 Hello.scala 文件为:

import chisel3._
import chisel3.util._

class Hello extends Module {
  val io = IO(new Bundle {
    val led = Output(UInt(8.W))  // 8 位 LED 输出
  })

  val maxCount = (50000000 / 10).U  // 调整这个参数改变流水灯的速度(DE2-115 使用 50MHz 时钟)
  val counter = RegInit(0.U(32.W))
  val position = RegInit(0.U(3.W))

  // 计数器逻辑
  counter := counter + 1.U
  when(counter === maxCount) {
    counter := 0.U
    when(position === 7.U) {
      position := 0.U
    }.otherwise {
      position := position + 1.U
    }
  }

  // LED 输出逻辑
  io.led := (1.U << position)
}

object Hello extends App {
  (new chisel3.stage.ChiselStage).emitVerilog(new Hello())
}

重新运行:
在这里插入图片描述

生成的Hello.v 文件,直接将该文件设置为顶层文件:

module Hello(
  input        clock,
  input        reset,
  output [7:0] io_led
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
`endif // RANDOMIZE_REG_INIT
  reg [31:0] counter; // @[Hello.scala 57:24]
  reg [2:0] position; // @[Hello.scala 58:25]
  wire [31:0] _counter_T_1 = counter + 32'h1; // @[Hello.scala 61:22]
  wire [2:0] _position_T_1 = position + 3'h1; // @[Hello.scala 67:28]
  assign io_led = 8'h1 << position; // @[Hello.scala 72:18]
  always @(posedge clock) begin
    if (reset) begin // @[Hello.scala 57:24]
      counter <= 32'h0; // @[Hello.scala 57:24]
    end else if (counter == 32'h4c4b40) begin // @[Hello.scala 62:30]
      counter <= 32'h0; // @[Hello.scala 63:13]
    end else begin
      counter <= _counter_T_1; // @[Hello.scala 61:11]
    end
    if (reset) begin // @[Hello.scala 58:25]
      position <= 3'h0; // @[Hello.scala 58:25]
    end else if (counter == 32'h4c4b40) begin // @[Hello.scala 62:30]
      if (position == 3'h7) begin // @[Hello.scala 64:28]
        position <= 3'h0; // @[Hello.scala 65:16]
      end else begin
        position <= _position_T_1; // @[Hello.scala 67:16]
      end
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  counter = _RAND_0[31:0];
  _RAND_1 = {1{`RANDOM}};
  position = _RAND_1[2:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule

引脚分配:
在这里插入图片描述

编译。没有错误了,OK,下载。
没反应!!!!准备要哭了,随便点了个开发板上reset按键,哦,哦,哦,流水灯居然正常工作了。
看看上面代码 ,
好像chisel里面代码生成里面有 if(res_n)判断,猜是判断按键吧?那么我把按键直接去掉试试?

好了,在逻辑判断里面,设置为复位之后有效即可,原先是需要手动按键才能触发:
在这里插入图片描述
在这里插入图片描述

实验效果:
在这里插入图片描述


总结

学习Chisel语言是一段既充满挑战又极具启发性的旅程。Chisel以Scala为基础,它的抽象级别高,极大提升了硬件设计效率,让代码更简洁且易于维护。通过Chisel,我体验了用近似软件工程的思维做硬件设计的便捷,特别是在模块化、参数化设计上的优势,这为复用代码和快速迭代创造了条件。Chisel结合Scala的强大生态,使得测试和验证更加高效,同时降低了硬件设计的学习曲线,尤其适合教学和研究用途。亲手实践,如在IDEA中配置环境并实现流水灯项目,让我深刻理解了理论到实践的每一步,过程中遇到问题的解决也锻炼了自我探索能力。总之,Chisel正引领硬件设计的新风潮,它不仅丰富了我的技术栈,也激发了对硬件设计未来无限可能的想象。

参考

WIN10系统下,用Chisel开发入门FPGA的HelloWorld呼吸灯

【多图预警】Windows 安装 SBT、IDEA 使用 SBT 构建项目指南

Scala安装出现neither build.sbt nor a…问题解决

Chisel入门之路(一)之在windows下vscode搭建|部署Scala2.13.3开发环境|安装教程

Chisel速成——跟着这个Chisel教程来就行了(已完结)

【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)

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

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

相关文章

JMeter Plugins Manager---插件安装

参考文章&#xff1a;https://blog.51cto.com/u_14126/6291032 需求&#xff1a; 安装【jpgc - Standard Set】插件 常用插件&#xff1a; 点击下载–报错如下&#xff1a; Failed to apply changes:Cannotapplychanges:Haveno write accessforJMeterdirectories,notpossib…

【机器学习数据挖掘】基于ARIMA 自回归积分滑动平均模型的销售价格库存分析报告 附完整python代码

资源地址&#xff1a;Python数据分析大作业 4000字 图文分析文档 销售分析 完整python代码 ​ 完整代码分析 同时销售量后1000的sku品类占比中&#xff08;不畅销产品&#xff09;如上&#xff0c;精品类产品占比第一&#xff0c;达到66.7%&#xff0c;其次是香化类产品&#…

Transformers实战03-PEFT库使用LORA方法微调。

文章目录 简介PEFTLORA方法Vision Transformer (ViT) lora方法实战模型选择google/vit-base-patch16-224-in21kgoogle/vit-base-patch16-224 数据集模型PEFT configuration and model训练预测 简介 PEFT PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;是一个用…

开窗函数!

开窗函数&#xff08;Window Function&#xff09;是SQL中的一种高级功能&#xff0c;允许你在一组相关行&#xff08;一个“窗口”&#xff09;上执行聚合操作&#xff0c;而不像传统聚合函数&#xff08;如SUM(), AVG(), COUNT()&#xff09;那样将所有匹配行合并成单个汇总行…

这就是英伟达 CEO 黄仁勋所说的人工智能“下一波浪潮”|TodayAI

在台湾一年一度的科技展 COMPUTEX 开幕前的周日&#xff0c;英伟达&#xff08;Nvidia&#xff09;首席执行官黄仁勋&#xff08;Jensen Huang&#xff09;表示&#xff0c;机器人和“理解物理定律的 AI”将成为下一波技术浪潮。他指出&#xff0c;英伟达目前正在推动生成式人工…

[Redis]Zset类型

Zset有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。 它保留了集合不能有重复成员的特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有一个唯一的浮点类型的分数&#xff08;score&#xff09;与之关联&#xff0c;着使得有序集合中的元素是可…

c语言:自定义类型(枚举、联合体)

前言&#xff1a; c语言中中自定义类型不仅有结构体&#xff0c;还有枚举、联合体等类型&#xff0c;上一期我们详细讲解了结构体的初始化&#xff0c;使用&#xff0c;传参和内存对齐等知识&#xff0c;这一期我们来介绍c语言中的其他自定义类型枚举和联合体的知识。 1.位段 …

jupyter notebook anaconda环境下查看|加载|更换内核

文章目录 1 问题复现2 查看内核位置3 调整python解释器位置 1 问题复现 在conda虚拟环境中使用pip安装相应package&#xff0c; 但是在jupyter notebook中加载该package时报错 [ERROR]ModuleNotFoundError: No module named shap 此时&#xff0c;除去包安装出现问题以外&am…

ARM学习(28)NXP 双coreMCU IMX1160学习

笔者最近接触到一块IMXRT1160的双core板子&#xff0c;特依次来记录学习一下 1、IMXRT1160 板子介绍 介绍一下NXP的Demo板子&#xff0c;是一个双core的板子&#xff0c;Cortex-M7和Cortex-M4&#xff0c;总计1MB的RAM空间&#xff0c;256KB的ROM空间&#xff0c;提供了丰富的…

哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上

护网哥斯拉、冰蝎、中国蚁剑流量分析 【点击免费领取】CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》&#x1f517;包含了应急响应工具、入侵排查、日志分析、权限维持、Windows应急实战、Linux应急实战、Web应急实战。 护网中最担心的是木马已经到了服…

CV每日论文--2024.6.4

1、Mixed Diffusion for 3D Indoor Scene Synthesis 中文 标题&#xff1a;用于 3D 室内场景合成的混合扩散 简介&#xff1a;这篇论文提出了一种名为MiDiffusion的混合离散-连续扩散模型,用于从给定的房间类型、平面图和可能存在的物体中合成逼真的3D室内场景。 作者指出,该…

芯片验证分享5 —— 激励开发3

大家好&#xff0c;我是谷公子&#xff0c;上节课跟大家分享了黑盒技术中的等价类分析和边界值分析方法。我们这次来分享下黑盒设计中的其它技术。 边界值分析和等价类划分的一个弱点是没有对输入条件的组合进行分析。对输入组合进行验证并不是简单的事情&#xff0c;因为即使…

Linux 36.3 + JetPack v6.0@jetson-inference之语义分割

Linux 36.3 JetPack v6.0jetson-inference之语义分割 1. 源由2. segNet2.1 命令选项2.2 下载模型2.2.1 Cityscapes2.2.2 DeepScene2.2.3 MHP2.2.4 VOC2.2.5 SUN 2.3 操作示例2.3.1 单张照片2.3.2 多张照片2.3.3 视频 3. 代码3.1 Python3.2 C 4. 参考资料 1. 源由 分类和目标识…

指针的认识(野指针、规避野指针、assert宏断言)

目录 a.野指针成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 b.规避野指针 1.指针初始化 2.小心指针越界 3.指针变量不再使用时&#xff0c;及时置NULL&#xff0c;指针使用之前检查有效性 4.避免返回局部变量的地址 c.assert宏断言的使用 概念&#xff1…

【Kubernetes】k8s的调度约束(亲和与反亲和)

一、调度约束 list-watch 组件 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和…

Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式

一、前言 上一篇文章是写的用Qt的内置函数方式获取本地摄像头名称集合&#xff0c;但是有几个缺点&#xff0c;比如要求Qt5&#xff0c;或者至少要求安装了多媒体组件multimedia&#xff0c;如果没有安装呢&#xff0c;或者安装的是个空的呢&#xff0c;比如很多嵌入式板子&am…

js

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Document</title></head><body><input type"button" values"点击" onclick"alert(hahaha)"><script>alert(&…

【开源三方库】Fuse.js:强大、轻巧、零依赖的模糊搜索库

1.简介 Fuse.js是一款功能强大且轻量级的JavaScript模糊搜索库&#xff0c;支持OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;操作系统&#xff0c;它具备模糊搜索和排序等功能。该库高性能、易于使用、高度可配置&#xff0c;支持多种数据类型和多语…

界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(二)

DevExpress WinForms的Diagram&#xff08;流程图&#xff09;组件允许您复制Microsoft Visio中的许多功能&#xff0c;并能在下一个Windows Forms项目中引入信息丰富的图表、流程图和组织图。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows F…

Solidworks 提取模型中的零件,并组合成一个新的零件,放入特征库

对方发来一个STP文件&#xff0c;其中有模型的部分零件想为我所用。 Shift键鼠标左键 选取需要的零件 在选好零件上右键&#xff0c;选择“孤立” 左边找到部件&#xff0c;ctrl左键选中&#xff0c;选择“插入到新零件” 点 绿色 勾 就选择保存类型&#xff0c;完成 。 打开这…