当前位置: 首页 > news >正文

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型

首先用excel表格做好寄存器描述

然后编写脚本生成.ralf文件

(1)首先通过openpyxl读取EXCEL表格,

workbook = openpyxl.load_workbook('reg.xlsx')  # 返回一个workbook数据类型的值
 

(2)获得有效表格的整体大小即最大行和列

sheet = workbook['Sheet1']  # 获取某一个表
print(sheet.dimensions)     # 获取表格的尺寸大小
row_num = sheet.max_row     # 行
line_num = sheet.max_column # 列
 

(3)写出寄存器的各部分所对应的列,字母是用于后方访问单元格

reg_column          = 'A'   # 各部分的所在列
address_column      = 'B'
reg_access_column   = 'C'
field_column        = 'D'
field_access_column = 'E'
reset_value_column  = 'F'
bit_end_column      = 'G'
bit_start_column    = 'H'
function_column     = 'I'
 

(4)读取到寄存器名(regname)不为空(None)时先处理寄存器的部分再处理寄存器的域,因为写入.ralf文件的顺序就是先写reg再是field。


(5)按照寄存器名(regname)判断每一个寄存器有几个域(field)。通过regname之间空了多少个来判断。中间穿插了写.ralf的部分。

for i in range(2,row_num+1): #  i < row_num 所以要加一 第一行是描述性的
    j = i
    cell_data = sheet[reg_column + str(i)]
    if(cell_data.value!=None): # 处理寄存器
        start_row = cell_data.row
        # 寄存器的相关属性
        reg_name = cell_data.value
        reg_addr = sheet[address_column + str(i)].value
        reg_access = sheet[reg_access_column + str(i)].value
        file_obj.write("    register " + reg_name+ " @" +reg_addr+" {\n")
        # file_obj.write("bytes " + str(1)) # byte 没有则自动计算
        print("reg name is",reg_name,"reg addr is ",reg_addr,"reg access is ",reg_access)
        while(1):
            j += 1
            if(j < row_num):
                if(sheet[reg_column + str(j)].value!=None):
                    end_row = j 
                    reg_filed = end_row - start_row 
                    print(cell_data.value,"reg  filed is" ,reg_filed )
                    break
            else:
                end_row = j
                reg_filed = end_row - start_row
                print(cell_data.value,"reg  filed is" ,reg_filed )
                break
 

判断逻辑:
当知道regname不为空(None)时,记录当前行数,开始寻找下一个不为空的名字。注意None的第一个字符是大写
在寻找的过程中要保证不能超出最大范围
找到下一个regname不为空的行数,并与之前记录的作差,并记录下field的个数
(6)根据field的个数依次向下x行,读取field的相关信息

 for field_num in range(0,reg_filed) :
        fiedl_name = sheet[field_column+str(i+field_num)].value                 # 域的名字
        print("fiedl_name is ",fiedl_name)
        field_access = sheet[field_access_column+str(i+field_num)].value        # 域的access
        print("field access is ",field_access)
        field_reset_num = sheet[reset_value_column + str(i+field_num)].value    # 复位值
        print("field_reset_nume ",field_reset_num)
        field_bit_start = sheet[bit_start_column+str(i+field_num)].value        # 起始位数
        field_bit_end = sheet[bit_end_column+str(i+field_num)].value            # 最终位数
        field_bits = field_bit_end - field_bit_start + 1                        # 共计多少bit
        print("bit start " , field_bit_start , "end " ,field_bit_end ,"bits " ,field_bits)
        file_obj.write("        field " + str(fiedl_name)+" {\n")
        file_obj.write("            bits " + str(field_bits)+";\n")
        file_obj.write("            reset " + str(field_reset_num)+";\n")
        file_obj.write("            access " + str(field_access).lower()+";\n") # ralgen 区分大小写
        file_obj.write("        }\n")
    file_obj.write("    }\n")   
print("out for ",i)
 

中间穿插了大量的写文件操作,并且为了.ralf文件内的风格添加了大量空格
最后一行的out for是为了调试时查看是否跳出一次for循环
可以打印以下内容 方便调试。

完整代码如下:

import os
import openpyxl
dst_filename = 'mgc_uart_reg.ralf'
workbook = openpyxl.load_workbook('reg.xlsx')  # 返回一个workbook数据类型的值
file_obj = open(dst_filename,'w') # 打开目标文件
print(workbook.sheetnames)  # 打印Excel表中的所有表
sheet = workbook['Sheet1']  # 获取某一个表
print(sheet.dimensions)     # 获取表格的尺寸大小
row_num = sheet.max_row     # 行
line_num = sheet.max_column # 列

reg_column          = 'A'   # 各部分的所在列
address_column      = 'B'
reg_access_column   = 'C'
field_column        = 'D'
field_access_column = 'E'
reset_value_column  = 'F'
bit_end_column      = 'G'
bit_start_column    = 'H'
function_column     = 'I'
# 这里只有一个block所在在循环外面写
file_obj.write("block uart_reg_block { \n")
file_obj.write("    bytes " + str(11)+';\n') # byte 
for i in range(2,row_num+1): #  i < row_num 所以要加一 第一行是描述性的
    j = i
    cell_data = sheet[reg_column + str(i)]
    if(cell_data.value!=None): # 处理寄存器域
        start_row = cell_data.row
        # 寄存器的相关属性
        reg_name = cell_data.value
        reg_addr = sheet[address_column + str(i)].value
        reg_access = sheet[reg_access_column + str(i)].value
        file_obj.write("    register " + reg_name+ " @" +reg_addr+" {\n")
        # file_obj.write("bytes " + str(1)) # byte 没有则自动计算
        print("reg name is",reg_name,"reg addr is ",reg_addr,"reg access is ",reg_access)
        while(1):
            j += 1
            if(j < row_num):
                if(sheet[reg_column + str(j)].value!=None):
                    end_row = j 
                    reg_filed = end_row - start_row 
                    print(cell_data.value,"reg  filed is" ,reg_filed )
                    break
            else:
                end_row = j
                reg_filed = end_row - start_row
                print(cell_data.value,"reg  filed is" ,reg_filed )
                break

        for field_num in range(0,reg_filed) :
            fiedl_name = sheet[field_column+str(i+field_num)].value                 # 域的名字
            print("fiedl_name is ",fiedl_name)
            field_access = sheet[field_access_column+str(i+field_num)].value        # 域的access
            print("field access is ",field_access)
            field_reset_num = sheet[reset_value_column + str(i+field_num)].value    # 复位值
            print("field_reset_nume ",field_reset_num)
            field_bit_start = sheet[bit_start_column+str(i+field_num)].value        # 起始位数
            field_bit_end = sheet[bit_end_column+str(i+field_num)].value            # 最终位数
            field_bits = field_bit_end - field_bit_start + 1                        # 共计多少bit
            print("bit start " , field_bit_start , "end " ,field_bit_end ,"bits " ,field_bits)
            file_obj.write("        field " + str(fiedl_name)+" {\n")
            file_obj.write("            bits " + str(field_bits)+";\n")
            file_obj.write("            reset " + str(field_reset_num)+";\n")
            file_obj.write("            access " + str(field_access).lower()+";\n") # ralgen 区分大小写
            file_obj.write("        }\n")
        file_obj.write("    }\n")   
    print("out for ",i)
file_obj.write("}")
file_obj.close()
print("clear")
SystemExit
 

2.通过ralgen的命令生成寄存器模型

要使用ralgen命令生成寄存器模型,需要以下步骤:

1. 安装ralgen工具。这个工具可以从Accellera官方网站的SystemRDL项目中获取。下载并安装适合你的操作系统的版本。

2. 编写一个SystemRDL描述文件。这个文件描述了寄存器及其字段的属性和行为。

3. 在终端或命令提示符下,使用ralgen命令来生成寄存器模型。命令语法如下:

   ```
   ralgen -l <language> -t <template> -b <base_addr> -o <output_dir> <input_file.rdl>
   ```

   其中,`<language>`是生成模型的目标语言,可以是Verilog、VHDL或SystemVerilog等;`<template>`是使用的模板类型,可以是uvm、sv等;`<base_addr>`是寄存器的基地址;`<output_dir>`是生成模型文件的输出目录;`<input_file.rdl>`是输入的SystemRDL描述文件。

   例如,下面的命令将生成一个UVM的寄存器模型:

   ```
   ralgen -l uvm -t uvm_reg -b 0x1000 -o output my_registers.rdl
   ```

4. 执行ralgen命令后,会生成相应的模型文件。根据你选择的模板类型和目标语言,生成的文件可能包括一个寄存器模型和一个测试模型。

5. 检查生成的模型文件,确保寄存器及其字段的属性和行为与你的SystemRDL描述文件一致。

这样,你就可以通过ralgen命令生成寄存器模型了。请注意根据你的具体需求调整命令参数。

相关文章:

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 &#xff08;1&#xff09;首先通过openpyxl读取EXCEL表格&#xff0c; workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 &#xff08;2&#xff…...

PL/SQL批量生成数据

在PL/SQL中生成大量模拟数据&#xff0c;特别是当你需要生成大量记录&#xff08;如1亿条&#xff09;时&#xff0c;有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践&#xff1a; 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...

Xcode模拟器运行报错:The request was denied by service delegate

Xcode模拟器运行报错&#xff1a;The request was denied by service delegate 造成的原因: &#xff08;1&#xff09;新的苹果M系列芯片的Mac电脑 &#xff08;2&#xff09;此电脑首次安装启动Xcode的应用程序 &#xff08;3&#xff09;此电脑未安装Rosetta 2 解决方法: …...

2024小迪安全基础入门第十课

目录 一、传输格式&数据-类型&编码&算法 1. 传输格式&#xff1a; 2. 传输数据&#xff1a; 3. 影响与渗透测试&#xff1a; #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储&#xff1a; 2. 密码存储的影响&#xff1a; 3.…...

Redisson分布式限流器

Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流&#xff0c;调研的限流框架大概有&#xff1a; 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...

xvisor调试记录

Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

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

家庭路由器跑PCND的优点

在当今数字化的时代&#xff0c;PCDN&#xff08;Peer-to-Peer Content Delivery Network&#xff09;技术逐渐走入人们的视野&#xff0c;有人考虑在家庭路由器上跑PCDN&#xff0c;下面是优点&#xff1a; 1.资源利用最大化 家庭网络在很多时候存在闲置的带宽和计算资源。通…...

ASP.NET Core API + MySql

环境 数据库&#xff1a; mysql8.0 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…...

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一种学习率调度器&#xff0c;主要用于在模型训练过程中根据某些指标&#xff08;如验证损失&#xff09;动态调整学习率。它是一种基于性能指标动态调整学习率的策略&#xff0c;而不是预定义的固定时间调整。 主要…...

Dubbo

官方文档&#xff1a; Java SDK 手册 | Apache Dubbo 一 RPC及Dubbo 1 什么是RPC dubbo是⼀款⾼性能的rpc框架。什么是rpc呢&#xff1f; rpc是⼀种协议&#xff1a;是⼀种远程过程调⽤&#xff08;remote procudure call&#xff09;协议 rpc协议是在应⽤层之上的协议&…...

算法1(蓝桥杯18)-删除链表的倒数第 N 个节点

问题&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头节点。 输入&#xff1a;head 1 -> 2 -> 3 -> 4 -> 5 -> null, n 2 输出&#xff1a;1 -> 2 -> 3 -> 5 -> null输入&#xff1a;head 1 ->…...

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…...

《C语言程序设计现代方法》note-8 指针和数组的关系

文章目录 助记提要12章 指针和数组12.1 指针的算术运算12.2 指针用于数组处理结合使用*和运算符 12.3 数组名作为指针数组名可以用作指针指针也可以当做数组名数组型实参 12.4 指针和多维数组处理每个元素处理行处理列多维数组名做指针 12.5 指针和变长数组 助记提要 指针支持…...

安科瑞电能质量治理产品在分布式光伏电站的应用-安科瑞黄安南

1.概述 随着全球对可再生能源需求的增加&#xff0c;分布式光伏电站的建设和发展迅速。然而&#xff0c;分布式光伏电站的运行过程中面临着一系列问题&#xff0c;比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率&#xff0c;还会对…...

JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异主要体现在 Vue 如何追踪数组的变化&#xff0c;以及 Vue 如何处理数组…...

项目组件框架介绍[bRPC]

文章目录 前言bRPC安装bRPC的简单使用protobuf简单使用Echo服务远程调用Echo服务 与etcd关联 前言 bRPC是百度开源的一款工业级RPC框架&#xff0c;功能强大, 常用于搜索、存储、机器学习、广告、推荐等高性能系统。 bRPC安装 使用源码安装即可, 在安装前要确认依赖 sudo apt…...

基于MobileNetV3架构动物声音分类识别与应用系统实现

1.摘要 本文主要实现了一个基于MobileNetV3架构的深度学习模型用于动物声音分类识别任务。该MobileNetV3是一种轻量级的卷积神经网络&#xff0c;旨在实现高效分类性能&#xff0c;本章在猫、狗、海豚等三个动物声音(.wav数据集&#xff09;上进行了训练和测试&#xff0c;即在…...

ragflow连ollama时出现的Bug

ragflow和ollama连接后&#xff0c;已经添加了两个模型但是ragflow仍然一直warn&#xff1a;Please add both embedding model and LLM in Settings &#xff1e; Model providers firstly.这里可能是我一开始拉取的镜像容器太小&#xff0c;容不下当前添加的模型&#xff0c;导…...

[大数据]Hudi编译集成

1. 编译环境准备 相关组件版本如下&#xff1a; Hadoop3.3.1Hive3.1.3Flink1.13.6&#xff0c;scala-2.12Spark3.3.1&#xff0c;scala-2.12 1&#xff09;安装Maven &#xff08;1&#xff09;上传apache-maven-3.6.1-bin.tar.gz到/opt/software目录&#xff0c;并解压更名…...

rk3588-ubuntu22.04系统网关实现路由器功能:

rk3588-ubuntu22.04系统网关实现路由器功能&#xff1a; 场景需求描述&#xff1a; 需求背景&#xff1a; 场景一&#xff1a;通过网线eth0/(路由器wlan0)访问外网&#xff1a; 如果网关 和 设备所处的环境可以通过网线联网或者路由器联网&#xff0c;那么不需要将网关配置成…...

Python部署教程-Python项目怎样在Pycharm中运行

大家好&#xff0c;我是程序员徐师兄&#xff0c;今天为大家带来的是Python部署教程-Python项目怎样在Pycharm中运行。Python安装部署教程&#xff0c;包括软件的下载&#xff0c;软件的安装。该系统采用 Python语言开发&#xff0c;flask、Django 框架&#xff0c;MySql 作为数…...

代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明&#xff0c;如果都用C的话&#xff0c;我大概率写不完&#xff0c;所以思路方面&#xff0c;我可能考虑用pyhon先写&#xff0c;后续会用文心一言转换成C 2.这里可以直接用层…...

C/C++常见符号与运算符

C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支&#xff1b;在 switch-case 中如 case 1:表示标签结束点&#xff1b;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同&#xff1b;switch-case中也有:…...

maven报错“找不到符号“

问题 springboot项目 maven编译打包过程&#xff0c;报错"找不到符号" 解决 很多网上方法都试过&#xff0c;都没用 换jdk&#xff0c;把17->21...

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置

一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景&#xff0c;支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警…...

【Kubernetes理论篇】容器集群管理系统Kubernetes(K8S)

Kubernetes集群部署基本管理实战 这么好的机会&#xff0c;还在等什么&#xff01; 01、Kubernetes 概述 K8S是什么 K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;写”。不如整个缩写 K8s 作为缩写的结果…...

鸿蒙ArkTS语言基础语法详解

文章目录 鸿蒙ArkTS语言基础语法详解一、引言二、ArkTS语言概述1. ArkTS语言特点2. TypeScript基础语法2.1 类型注解2.2 接口2.3 泛型2.4 类的继承2.5 类的访问修饰符 三、ArkTS的基本组成3.1 装饰器3.2 UI描述3.3 自定义组件3.4 系统组件3.5 属性方法和事件方法 四、自定义组件…...

两条链表相同位数相加

优质博文IT-BLOG-CN 一、题目 给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字0之外&#xff0c;这…...

C语言单元总结

黑色加粗表示刷题刷到这样的题 红色加粗表示可能重要 单元一 程序设计宏观认识 C语言程序框架 C语言程序最基本的程序框架由两部分构成&#xff0c;分别是 1) 编译预处理 2) 函数组 C语言程序构成 C程序最大的特点就是所有的程序都是用函数来装配的&#xff0c;函数是构成…...

【Golang】Go语言编程思想(六):Channel,第二节,使用Channel等待Goroutine结束

使用 Channel 等待任务结束 首先回顾上一节 channel 这一概念介绍时所写的代码&#xff1a; package mainimport ("fmt""time" )func worker(id int, c chan int) {for n : range c {fmt.Printf("Worker %d received %c\n",id, n)} }func crea…...

Oracle RAC开启和关闭日志归档Log Archive

一、开启日志归档模式 # srvctl stop database -d <DB_NAME> # srvctl start instance -d <DB_NAME> -i <INSTANCE_NAME> -o mount # 停止 RAC 数据库的所有实例&#xff1a; [oracleora19crac1:/home/oracle]$srvctl stop database -d orcl # 启动第一个实…...

今天调了个转速的小BUG

同事说转速表有个bug&#xff0c;转速停止后&#xff0c;继电器没有恢复到初始状态。若停止之前是报警&#xff0c;继电器吸合&#xff0c;则停止后继电器还是吸合。我心想不会啊&#xff0c;这软件都弄了好几年了&#xff0c;一直也没出现过状况。 经过与调试同事的沟通&#…...

RabbitMQ七种工作模式之 RPC通信模式, 发布确认模式

文章目录 六. RPC(RPC通信模式)客户端服务端 七. Publisher Confirms(发布确认模式)1. Publishing Messages Individually(单独确认)2. Publishing Messages in Batches(批量确认)3. Handling Publisher Confirms Asynchronously(异步确认) 六. RPC(RPC通信模式) 客⼾端发送消息…...

【Python教程】Python3基础篇之基础语法

博主介绍:✌全网粉丝21W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…...

使用docker-compose安装Milvus向量数据库及Attu可视化连接工具

首先确保系统已经安装上了docker 然后去https://github.com/docker/compose/releases/下载安装docker-compose 跟随自己下系统和服务器情况下载 上传到服务器 mv docker-compose-linux-aarch64 docker-compose chmod x docker-compose2.dockr-compose命令 docker-compose …...

IoTDB Allocate WAL Buffer Fail Because out of memory

问题及现象 时序数据库 IoTDB 集群报错&#xff1a; The write is rejected because the wal directory size has reached the threshold 53687091200 bytes. You may need to adjust the flush policy of the storage storageengine or the IoTConsensus synchronization pa…...

Go支付中台方案:多平台兼容与多项目对接

一、中台的概念 中台是一种企业级的架构模式&#xff0c;它处于前台应用和后台资源之间&#xff0c;将企业核心能力进行整合、封装&#xff0c;形成一系列可复用的业务能力组件。这些组件就像乐高积木一样&#xff0c;可以被不同的前台业务快速调用&#xff0c;从而避免重复开…...

设计模式:23、享元模式

目录 0、定义 1、享元模式的三种角色 2、享元模式的UML类图 3、示例代码 0、定义 运营共享技术有效地支持大量细粒度的对象 1、享元模式的三种角色 享元接口&#xff08;Flyweight&#xff09;&#xff1a;是一个接口&#xff0c;该接口定义了享元对外公开其内部数据的方…...

如何使用靜態IP代理?【詳細教程】

靜態IP地址是手動分配給設備或伺服器的固定不變的 IP。與動態 IP 地址不同&#xff0c;動態 IP 地址由 DHCP 伺服器自動分配&#xff0c;並且會隨時間而變化。​​​​​​​ 如何獲取和設置靜態IP地址 一、檢查是否需要靜態IP&#xff1f; 在配置靜態 IP 之前&#xff0c;請…...

C++day3

1、把课上类的三个练习题的构造函数写出来 #include <iostream> #include <cstring>using namespace std;class Car {string color;string brond;double speed; public:Car(string c,string b,double s):color("black"),brond("Benz"),speed(…...

ABAP开发-批量导入BAPI和BDC_1

系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入&#xff08;录屏&#xff09;2、BAPI数据导入 三、实例1、BAPI2、BDC 总结 前言 一、概念 SAP中&#xff0c;对一个事务码反复操作并且达到批量处理数据的效果&#xff0…...

iOS 语音循环播放设置

本地文件、网络文件&#xff0c;区别就是URL创建方式 1、使用AVPlayerItem与AVPlayer&#xff08;这个简单&#xff0c;只需要设置回调&#xff09;&#xff0c;而不是AVAudioPlayer&#xff08;这个麻烦&#xff0c;需要设置代理、计时器等等&#xff09; 2、设置AVPlayerIte…...

PlantUML——类图

背景 类图是UML模型中的静态视图&#xff0c;其主要作用包括&#xff1a; 描述系统的结构化设计&#xff0c;显示出类、接口以及它们之间的静态结构和关系。简化对系统的理解&#xff0c;是系统分析与设计阶段的重要产物&#xff0c;也是系统编码和测试的重要模型依据。 在U…...

ASP.NET Core实现鉴权授权的几个库

System.IdentityModel.Tokens.Jwt 和 Microsoft.AspNetCore.Authentication.JwtBearer 是两个常用的库&#xff0c;分别用于处理 JWT&#xff08;JSON Web Token&#xff09;相关的任务。它们在功能上有一定重叠&#xff0c;但侧重点和使用场景有所不同。 1. System.IdentityM…...

生成:安卓证书uniapp

地址&#xff1a; https://ask.dcloud.net.cn/article/35777 // 使用keytool -genkey命令生成证书&#xff1a; 官网&#xff1a; keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore ----------------------------------…...

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步&#xff0c;它通过去中心化的理念重新定义了数字世界。与传统的Web2相比&#xff0c;Web3将数据主权交还给用户&#xff0c;让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念&#xff0c;去中心化应用&#xff08;D…...

AR向左,AI向右,智能眼镜来到十字路口

从Google Glass到Vision Pro&#xff0c;人类对智能眼镜的探索有进展&#xff0c;但都不算成功&#xff0c;直至Ray-Ban Meta的出现&#xff0c;这才让行业对智能眼镜重燃信心&#xff0c;从去年开始&#xff0c;随着AI大模型应用的深入&#xff0c;智能眼镜又有了新的故事可说…...