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

验证自己的处理器——基于riscv-tests

在使用riscv-tests之前我们需要安装riscv-tool-chain 编译链并将 RISCV 环境变量设置为 RISC-V 工具 install 路径。可以参考之前的文章ubuntu20.04 riscv-gnu-toolchain编译链极简安装_ubuntu安装risv-gun-tools-CSDN博客安装好编译链后构建最新的riscv-tests$ git clone https://github.com/riscv/riscv-tests $ cd riscv-tests $ git submodule update --init --recursive $ autoconf $ ./configure --prefix$RISCV/target $ make $ make installriscv-tests的链接脚本link.ld在riscv-tests/env/p文件夹中可以根据自己的处理器内存映射进行修改不修改则默认连续。在/riscv-tests/isa路径下找到Makefile文件由于处理器目前只支持RV32I指令集因此对Makefile文件进行了修改# # Makefile for riscv-tests/isa #----------------------------------------------------------------------- XLEN ? 64 src_dir : . include $(src_dir)/rv64ui/Makefrag include $(src_dir)/rv32ui/Makefrag default: all #-------------------------------------------------------------------- # Build rules #-------------------------------------------------------------------- RISCV_PREFIX ? riscv64-unknown-elf- RISCV_GCC ? $(RISCV_PREFIX)gcc RISCV_GCC_OPTS ? -static -mcmodelmedany -fvisibilityhidden -nostdlib -nostartfiles RISCV_OBJDUMP ? $(RISCV_PREFIX)objdump --disassemble-all --disassemble-zeroes --section.text --section.text.startup --section.text.init --section.data RISCV_SIM ? spike vpath %.S $(src_dir) #------------------------------------------------------------ # Build assembly tests %.dump: % $(RISCV_OBJDUMP) $ $ %.out: % $(RISCV_SIM) --isarv64gch_ziccid_zfh_zicboz_svnapot_zicntr_zba_zbb_zbc_zbs --misaligned $ 2 $ %.out32: % $(RISCV_SIM) --isarv32gc_ziccid_zfh_zicboz_svnapot_zicntr_zba_zbb_zbc_zbs --misaligned $ 2 $ define compile_template $$($(1)_p_tests): $(1)-p-%: $(1)/%.S $$(RISCV_GCC) $(2) $$(RISCV_GCC_OPTS) -I$(src_dir)/../env/p -I$(src_dir)/macros/scalar -T$(src_dir)/../env/p/link.ld $$ -o $$ $(1)_tests $$($(1)_p_tests) $$($(1)_v_tests): $(1)-v-%: $(1)/%.S $$(RISCV_GCC) $(2) $$(RISCV_GCC_OPTS) -DENTROPY0x$$(shell echo \$$ | md5sum | cut -c 1-7) -stdgnu99 -O2 -I$(src_dir)/../env/v -I$(src_dir)/macros/scalar -T$(src_dir)/../env/v/link.ld $(src_dir)/../env/v/entry.S $(src_dir)/../env/v/*.c $$ -o $$ $(1)_tests $$($(1)_v_tests) $(1)_tests_dump $$(addsuffix .dump, $$($(1)_tests)) $(1): $$($(1)_tests_dump) .PHONY: $(1) COMPILER_SUPPORTS_$(1) : $$(shell $$(RISCV_GCC) $(2) -c -x c /dev/null -o /dev/null 2 /dev/null; echo $$$$?) ifeq ($$(COMPILER_SUPPORTS_$(1)),0) tests $$($(1)_tests) endif endef $(eval $(call compile_template,rv32ui,-marchrv32i -mabiilp32)) tests_dump $(addsuffix .dump, $(tests)) tests_hex $(addsuffix .hex, $(tests)) tests_out $(addsuffix .out, $(filter rv64%,$(tests))) tests32_out $(addsuffix .out32, $(filter rv32%,$(tests))) run: $(tests_out) $(tests32_out) junk $(tests) $(tests_dump) $(tests_hex) $(tests_out) $(tests32_out) #------------------------------------------------------------ # Default all: $(tests_dump) #------------------------------------------------------------ # Clean up clean: rm -rf $(junk)保存后退出输入make命令将在当前路径下生成rv32i指令集中指令的.hex文件和.dump文件如图所示将它们分别保存到两个不同的文件夹中方便后续使用进入hex文件夹创建hex2bin.py文件#!/usr/bin/env python3 import os import subprocess import glob def batch_generate_bin(): # 设置工具链路径 objcopy riscv64-unknown-elf-objcopy # 检查 objcopy 是否可用 try: subprocess.run([objcopy, --version], capture_outputTrue, checkTrue) except (subprocess.CalledProcessError, FileNotFoundError): print(f错误: 找不到 {objcopy}请检查工具链路径) return False # 创建输出目录 - 使用 ../bin output_dir ../bin os.makedirs(output_dir, exist_okTrue) # 查找所有 rv32ui-p-* 文件无后缀 test_files [f for f in glob.glob(rv32ui-p-*) if os.path.isfile(f)] # 过滤掉可能误匹配的文件 test_files [f for f in test_files if not f.endswith((.bin, .dump, .S, .s, .c))] if not test_files: print(未找到任何 rv32ui-p-* 测试文件) return False success_count 0 failed_files [] print(f找到 {len(test_files)} 个测试文件) for test_file in test_files: # 生成 bin 文件名 - 使用 ../bin 目录 bin_file os.path.join(output_dir, f{test_file}.bin) try: # 执行转换命令 result subprocess.run( [objcopy, -O, binary, test_file, bin_file], capture_outputTrue, textTrue, checkTrue ) if os.path.exists(bin_file) and os.path.getsize(bin_file) 0: success_count 1 else: print(f ✗ 生成的文件为空或不存在) failed_files.append(test_file) except subprocess.CalledProcessError as e: print(f ✗ 转换失败: {e.stderr.strip()}) failed_files.append(test_file) # 输出总结 print(\n *50) print(f批量转换完成) print(f成功: {success_count}/{len(test_files)}) if failed_files: print(f失败的文件:) for f in failed_files: print(f - {f}) return len(failed_files) 0 if __name__ __main__: batch_generate_bin()运行生成的.bin文件在/MyCPU_test/bin目录下。接下来进行编译与仿真建议安装iverilog与gtkwave$ git clone https://github.com/steveicarus/iverilog.git $ sudo apt-get install autoconf gperf flex bison build-essential $ sh autoconf.sh $ ./configure $ make $ make install $ sudo ln -s /usr/bin/python3.8 /usr/bin/python $ sudo apt-get install gtkwave在当前目录下添加rtl文件夹将所有.v文件放入文件夹中并添加compile_rtl.py文件import sys import subprocess import os def main(): rtl_dir ./rtl if not os.path.exists(rtl_dir): print(f错误: RTL 目录不存在: {rtl_dir}) return 1 # 构建 iverilog 命令 iverilog_cmd [iverilog, -o, out.vvp, -I, rtl_dir, -D, OUTPUTsignature.output] # 添加你的testbench 文件 tb_file os.path.join(rtl_dir, Top_tb.v) if not os.path.exists(tb_file): print(f错误: 找不到 testbench 文件: {tb_file}) return 1 iverilog_cmd.append(tb_file) # RTL 文件列表 rtl_files [ ALU.v, IDecoder.v, Regfile.v, cpu.v #...你的rtl文件 ] # 添加所有 RTL 文件 for rtl_file in rtl_files: full_path os.path.join(rtl_dir, rtl_file) if os.path.exists(full_path): iverilog_cmd.append(full_path) else: print(f警告: 文件不存在: {full_path}) # 执行编译 try: print(开始编译...) result subprocess.run(iverilog_cmd, capture_outputTrue, textTrue, timeout30) if result.returncode 0: print(编译成功!) return 0 else: print(编译失败!) print(STDERR:, result.stderr) return result.returncode except subprocess.TimeoutExpired: print(编译超时!) return 1 except Exception as e: print(f编译过程中出错: {e}) return 1 if __name__ __main__: sys.exit(main())在dump文件中找到add.dump文件观察到该指令通过测试的标志为:gp(x3)1a7(x17)930x5da0(x10)0并注意到最新版测试文件中包含了CSR指令因此建议测试前进行相关实现或处理tb文件如下需要修改对应的寄存器和存储器以适配你的设计并注意指令存储器和数据存储器都需要用inst.data初始化inst.data将在后面生成。timescale 1ns / 1ps define TEST_PROG 1 module tb (); reg clk; reg rst_n; //需要修改 wire [31:0] x3 u1.u_Regfile.regs[3]; wire [31:0] x10 u1.u_Regfile.regs[10]; wire [31:0] x17 u1.u_Regfile.regs[17]; integer r; initial begin ifdef TEST_PROG wait (x3 32d1) //测试结束 #100; if (x10 0) begin //通过测试 $display(~~~~~~~~~~~~~~~~~~~ TEST_PASS ~~~~~~~~~~~~~~~~~~~); $display(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~); $display(~~~~~~~~~ ##### ## #### #### ~~~~~~~~~); $display(~~~~~~~~~ # # # # # # ~~~~~~~~~); $display(~~~~~~~~~ # # # # #### #### ~~~~~~~~~); $display(~~~~~~~~~ ##### ###### # #~~~~~~~~~); $display(~~~~~~~~~ # # # # # # #~~~~~~~~~); $display(~~~~~~~~~ # # # #### #### ~~~~~~~~~); $display(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~); end else begin $display(~~~~~~~~~~~~~~~~~~~ TEST_FAIL ~~~~~~~~~~~~~~~~~~~~); $display(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~); $display(~~~~~~~~~~###### ## # # ~~~~~~~~~~); $display(~~~~~~~~~~# # # # # ~~~~~~~~~~); $display(~~~~~~~~~~##### # # # # ~~~~~~~~~~); $display(~~~~~~~~~~# ###### # # ~~~~~~~~~~); $display(~~~~~~~~~~# # # # # ~~~~~~~~~~); $display(~~~~~~~~~~# # # # ######~~~~~~~~~~); $display(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~); $display(fail testnum %2d, x3); for (r 0; r 32; r r 1) $display(x%2d 0x%x, r, u1.u_Regfile.regs[r]); end #100 $finish; endif end initial begin rst_n0; clk0; for (integer i 0; i 8191; i i 1) begin u1.u_data_ram.u_dram.mem_array[i] 32d0; u1.u_IFetch.u_irom.mem_array[i]32d0; end //需要修改成你的存储器对应的reg数组 $readmemh(inst.data, u1.u_data_ram.u_dram.mem_array); $display(Initialize dram with dram.data); //指令存储器和数据存储器的初始化文件相同 $readmemh(inst.data, u1.u_IFetch.u_irom.mem_array); $display(Initialize iram with inst.data); #100 rst_n1; end always #5 clk ~clk; // sim timeout initial begin #5000000 $display(Time Out.); $finish; end //例化你的处理器 riscv_mcu u1 ( .clk (clk), .rst_n (rst_n) ); //生成vcd文件使用gtkwave观察 initial begin $dumpfile(test.vcd); $dumpvars(0, Top_tb); end endmodule运行编译完成后进行仿真工作的准备在MyCPU_tests目录下新增BinToMem.py和sim.py如下BinToMem.py# BinToMem.py import sys import os def bin_to_mem(infile, outfile): try: with open(infile, rb) as binfile: binfile_content binfile.read() with open(outfile, w) as datafile: # 确保字节数是4的倍数不足则补0 remainder len(binfile_content) % 4 if remainder ! 0: binfile_content b\x00 * (4 - remainder) print(f警告: 文件字节数不是4的倍数已填充 {4-remainder} 个零字节) # 按32位字处理 for i in range(0, len(binfile_content), 4): word binfile_content[i:i4] # 转换为大端序反转字节顺序 big_endian_word word[::-1] hex_string big_endian_word.hex() datafile.write(hex_string \n) print(f成功转换: {infile} - {outfile}) print(f生成 {len(binfile_content)//4} 条指令) except FileNotFoundError: print(f错误: 文件 {infile} 不存在) return False except Exception as e: print(f转换过程中出错: {e}) return False return True if __name__ __main__: if len(sys.argv) 3: success bin_to_mem(sys.argv[1], sys.argv[2]) sys.exit(0 if success else 1) else: print(Usage: python BinToMem_CLI.py binfile datafile) sys.exit(1)sim.py:将文件编译集成到了sim.py中因此每次修改.v文件后仿真只需运行sim.py文件。import sys import filecmp import subprocess import sys import os # 主函数 def main(): #print(sys.argv[0] sys.argv[1] sys.argv[2]) # 1.编译rtl文件 cmd rpython compile_rtl.py f os.popen(cmd) f.close() # 2.将bin文件转成mem文件 cmd rpython BinToMem.py sys.argv[1] sys.argv[2] f os.popen(cmd) f.close() # 3.运行 vvp_cmd [rvvp] vvp_cmd.append(rout.vvp) process subprocess.Popen(vvp_cmd) try: process.wait(timeout10) except subprocess.TimeoutExpired: print(!!!Fail, vvp exec timeout!!!) if __name__ __main__: sys.exit(main())对add指令进行仿真$ python sim.py ./bin/rv32ui-p-add.bin inst.data仿真通过。对sh指令进行仿真$ python sim.py ./bin/rv32ui-p-sh.bin inst.data可以用gtkwave查看test.vcd文件可以看到x3寄存器保存了test num的值如果通过测试则x3的最终值为1x10的最终值为0。也可以将rtl文件、tb文件和待测指令的inst.data文件导入modelsim工作目录下使用modelsim进行编译与仿真最后我们可以利用test_all_isa脚本对所有指令进行测试test_all_isa.pyimport os import subprocess import sys import signal # 处理 BrokenPipeError signal.signal(signal.SIGPIPE, signal.SIG_DFL) # 找出path目录下的所有bin文件 def list_binfiles(path): files [] list_dir os.walk(path) for maindir, subdir, all_file in list_dir: for filename in all_file: apath os.path.join(maindir, filename) if apath.endswith(.bin): files.append(apath) return files def run_single_test(file): 运行单个测试文件 try: # 使用 subprocess.run 替代 os.popen cmd [python, sim.py, file, inst.data] result subprocess.run(cmd, capture_outputTrue, textTrue, timeout60) # 检查输出中是否包含 TEST_PASS if TEST_PASS in result.stdout: return True, result.stdout else: return False, result.stdout result.stderr except subprocess.TimeoutExpired: return False, TIMEOUT except Exception as e: return False, fERROR: {str(e)} # 主函数 def main(): bin_files list_binfiles(./bin) if not bin_files: print(错误: 在 ./bin 目录中未找到任何 .bin 文件) return 1 anyfail False passed_count 0 total_count len(bin_files) # 对每一个bin文件进行测试 for i, file in enumerate(bin_files, 1): print(f[{i}/{total_count}] 测试: {os.path.basename(file)}, end, flushTrue) success, output run_single_test(file) if success: print( - PASS) passed_count 1 else: print( - !!!FAIL!!!) print(f 失败原因: {output.split(chr(10))[0] if output else Unknown}) anyfail True # 如果希望一个失败就停止取消下面的注释 # break print( * 60) if not anyfail: print(f恭喜所有测试通过! ({passed_count}/{total_count})) return 0 else: print(f测试完成有测试失败。通过: {passed_count}/{total_count}) return 1 if __name__ __main__: sys.exit(main())运行测试结束。2026.3.3 更新处理器通过RV32IM指令集测试2026.3.12 更新处理器通过RV32IMF指令集测试参考资料tinyriscv: tiny开源riscvDeepseek

相关文章:

验证自己的处理器——基于riscv-tests

在使用riscv-tests之前,我们需要安装riscv-tool-chain 编译链,并将 RISCV 环境变量设置为 RISC-V 工具 install 路径。可以参考之前的文章:ubuntu20.04 riscv-gnu-toolchain编译链极简安装_ubuntu安装risv-gun-tools-CSDN博客 安装好编译链后…...

如何使用Lip Gloss自定义枚举器:为终端列表添加独特标识风格

如何使用Lip Gloss自定义枚举器:为终端列表添加独特标识风格 【免费下载链接】lipgloss Style definitions for nice terminal layouts 👄 项目地址: https://gitcode.com/gh_mirrors/li/lipgloss Lip Gloss是一款强大的终端样式定义工具&#xf…...

如何使用go-swagger防止SQL注入:保护API安全的完整指南

如何使用go-swagger防止SQL注入:保护API安全的完整指南 【免费下载链接】go-swagger Swagger 2.0 implementation for go 项目地址: https://gitcode.com/gh_mirrors/go/go-swagger 在现代Web开发中,SQL注入攻击仍然是最常见且最危险的安全威胁之…...

Rails Performance核心功能解析:从请求追踪到资源监控的完整教程

Rails Performance核心功能解析:从请求追踪到资源监控的完整教程 【免费下载链接】rails_performance Monitor performance of you Rails applications (self-hosted and free) 项目地址: https://gitcode.com/gh_mirrors/ra/rails_performance Rails Perfor…...

如何在5分钟内上手Bitsery:C++开发者必备的高效序列化工具

如何在5分钟内上手Bitsery:C开发者必备的高效序列化工具 【免费下载链接】bitsery Your binary serialization library 项目地址: https://gitcode.com/gh_mirrors/bi/bitsery Bitsery是一款专为C开发者设计的轻量级二进制序列化库,它能帮助你快速…...

终极RetDec高级功能解析:探索函数识别与类型重建的核心技术

终极RetDec高级功能解析:探索函数识别与类型重建的核心技术 【免费下载链接】retdec RetDec is a retargetable machine-code decompiler based on LLVM. 项目地址: https://gitcode.com/gh_mirrors/re/retdec RetDec作为一款基于LLVM的可重定向机器码反编译…...

终极指南:ExcelJS中ProtectionXform如何实现电子表格保护设置的XML转换

终极指南:ExcelJS中ProtectionXform如何实现电子表格保护设置的XML转换 【免费下载链接】exceljs exceljs: 一个用于读取、操作和写入电子表格数据以及样式到XLSX和JSON文件的库,支持Excel文件的逆向工程。 项目地址: https://gitcode.com/gh_mirrors/…...

终极指南:如何让Maccy实现跨屏幕剪贴板管理,提升多显示器工作效率

终极指南:如何让Maccy实现跨屏幕剪贴板管理,提升多显示器工作效率 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy Maccy作为一款轻量级macOS剪贴板管理器(Light…...

终极Maccy瘦身指南:5个高效方法减小macOS剪贴板管理器体积

终极Maccy瘦身指南:5个高效方法减小macOS剪贴板管理器体积 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy Maccy作为一款轻量级macOS剪贴板管理器,其小巧的体积是吸引用户的…...

uni-app x 学习系列(五)—— 视图容器 之 View 视图组件

<view> 是 UNI-APP 中布局的基本元素&#xff0c;类似于 HTML 中的 <div> 标签&#xff0c;主要用于创建块级容器。 示例&#xff1a;index.uvue <template><view class"container"><view class"header"><text>轮播图…...

【2026 最新】下载安装 Git 详细教程 (Windows)

一、下载Git 1.下载网址&#xff1a;Git - Downloads (git-scm.com)​https://git-scm.com/downloads 网盘链接&#xff1a; 通过百度网盘分享的文件&#xff1a;Git-2.50.1-64-bit.exe 链接:https://pan.baidu.com/s/1lRrAifTBtCYXAA4qr31UkA?pwddy6bhttps://pan.baidu.com…...

windows默认的环境变量及查看或设置环境变量

文章目录环境变量列表环境变量示例有两种方式。 1、界面查看&#xff0c;右键电脑 | 属性 | 环境变量。 2、cmd窗口&#xff0c;输入set就会列出全部环境变量。 资源管理器可以直接访问环境变量&#xff0c;如资源管理器地址栏输入&#xff1a;%APPDATA%&#xff0c;会直接跳转…...

embedded-graphics核心功能解析:掌握DrawTarget接口与显示驱动集成

embedded-graphics核心功能解析&#xff1a;掌握DrawTarget接口与显示驱动集成 【免费下载链接】embedded-graphics A no_std graphics library for embedded applications 项目地址: https://gitcode.com/gh_mirrors/em/embedded-graphics embedded-graphics是一个专为…...

V3 Admin Vite 实战指南:5分钟快速搭建企业级后台管理系统

V3 Admin Vite 实战指南&#xff1a;5分钟快速搭建企业级后台管理系统 【免费下载链接】v3-admin-vite v3-admin-vite:是一个基于Vite和Vue3的开源后台管理框架项目。特点&#xff1a;利用Vite的快速开发特性与Vue3的Composition API等新特性&#xff0c;提供高效的开发体验和现…...

油耗降至3.3L以下 HORSE H12概念发动机亮相

近日,浩思动力与西班牙能源公司雷普索尔(Repsol)联合发布新一代混合动力系统——HORSE H12概念发动机。该系统可直接使用100%可再生汽油运行,在提升混动效率的同时显著降低油耗与碳排放,为传统内燃机技术在低碳转型阶段提供新的技术路径。HORSE H12概念发动机通过优化燃烧系统设…...

BERT中文文本分割模型部署避坑:CUDA版本兼容、token长度限制与解决方案

BERT中文文本分割模型部署避坑&#xff1a;CUDA版本兼容、token长度限制与解决方案 1. 项目简介与背景 随着在线教育、远程会议等应用的普及&#xff0c;口语化的文字记录数量急剧增长。会议纪要、讲座转录、采访记录等文本往往缺乏段落结构&#xff0c;导致阅读体验差、信息…...

Janus-Pro-7B开发者案例:科研论文图表分析+插图生成工作流

Janus-Pro-7B开发者案例&#xff1a;科研论文图表分析插图生成工作流 1. 引言&#xff1a;科研工作者的双重挑战 如果你是一名科研人员或者学术写作者&#xff0c;一定对这两个场景不陌生&#xff1a; 场景一&#xff1a;图表分析 你刚刚完成了一组实验&#xff0c;得到了几…...

IPED取证工具问题排查:解决常见错误的终极指南

IPED取证工具问题排查&#xff1a;解决常见错误的终极指南 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a corporat…...

从安装到部署:dash-bootstrap-components项目实战全流程

从安装到部署&#xff1a;dash-bootstrap-components项目实战全流程 【免费下载链接】dash-bootstrap-components dash-bootstrap-components - 这是一个基于 Plotly.js 和 Bootstrap 的开源 Python 组件库&#xff0c;可以用于构建交互式数据可视化仪表板。适用于 Data Scienc…...

告别繁琐构建:用Task优雅实现自动化任务管理

告别繁琐构建&#xff1a;用Task优雅实现自动化任务管理 【免费下载链接】task A task runner / simpler Make alternative written in Go 项目地址: https://gitcode.com/gh_mirrors/ta/task Task是一款用Go语言编写的现代化任务运行工具&#xff0c;作为Make的轻量级替…...

服饰解构新范式:Nano-Banana软萌拆拆屋惊艳效果展示合集

服饰解构新范式&#xff1a;Nano-Banana软萌拆拆屋惊艳效果展示合集 1. 软萌拆拆屋&#xff1a;当AI遇见时尚解构 想象一下&#xff0c;你心爱的那条洛丽塔裙子&#xff0c;像棉花糖一样被温柔展开&#xff0c;每一个蝴蝶结、每一条蕾丝边都整齐地排列在眼前——这不是魔法&a…...

旋转式立体车库——旋转式立体车库

旋转式立体车库作为城市停车空间优化的重要解决方案&#xff0c;其核心作用在于通过三维立体布局与旋转取车机制&#xff0c;突破传统平面停车场的空间限制。该系统通过垂直方向的层叠设计与水平方向的旋转取车功能&#xff0c;将单位面积的停车容量提升至传统模式的数倍&#…...

提示词管理工具推荐prompt-manage,Docker一键部署和使用指南

prompt-manage 是一款面向 AI 从业者的轻量级开源提示词管理工具&#xff0c;专为 Docker 私有化部署设计&#xff0c;无外部依赖、开箱即用&#xff1b;提供提示词增删改查、标签分类、全文检索、版本控制、一键复制与数据导入导出&#xff0c;支持本地私密存储与网页端管理&a…...

聚合物与复合材料表面粗糙度测试方法的比较分析 - 综述

题目&#xff1a;聚合物与复合材料表面粗糙度测试方法的比较分析 - 综述 作者&#xff1a; Dimas Eko Prasetyo 机构&#xff1a; 布拉维贾亚大学机械工程系&#xff0c;玛琅 摘要 复合材料的发展可以与材料测试相结合&#xff0c;以获得复合材料的性能&#xff0c;如强度、硬度…...

music-metadata完全指南:从安装到高级API调用的完整教程

music-metadata完全指南&#xff1a;从安装到高级API调用的完整教程 【免费下载链接】music-metadata Stream and file based music metadata parser for node. Supporting a wide range of audio and tag formats. 项目地址: https://gitcode.com/gh_mirrors/mu/music-metad…...

gte-base-zh Embedding效果可视化:t-SNE降维展示不同类别中文句子分布

gte-base-zh Embedding效果可视化&#xff1a;t-SNE降维展示不同类别中文句子分布 1. 项目简介与背景 自然语言处理中&#xff0c;文本嵌入&#xff08;Text Embedding&#xff09;技术扮演着关键角色&#xff0c;它将文本转换为高维向量表示&#xff0c;让计算机能够"理…...

开源可部署!SiameseUniNLU中文NLU模型30分钟完成服务器部署与API接入

开源可部署&#xff01;SiameseUniNLU中文NLU模型30分钟完成服务器部署与API接入 统一处理多种自然语言理解任务的中文模型&#xff0c;30分钟从零部署到生产环境 1. 模型核心价值&#xff1a;一个模型解决九大NLU任务 SiameseUniNLU是一个真正意义上的通用自然语言理解模型&a…...

vscode-portfolio开发者指南:如何扩展和定制你的作品集

vscode-portfolio开发者指南&#xff1a;如何扩展和定制你的作品集 【免费下载链接】vscode-portfolio A VSCode themed developer portfolio built using Next.js 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-portfolio vscode-portfolio是一个基于Next.js构建…...

BeanUtils.copyProperties 和 clone() 方法的区别

BeanUtils.copyProperties 和 clone() 方法在 Java 中都可用于对象属性的复制&#xff0c;但它们在实现方式、使用场景和特性上有显著区别。1. 实现机制‌BeanUtils.copyProperties‌ 是通过 Java 反射机制实现的&#xff0c;它会自动获取源对象和目标对象的属性描述器&#xf…...

5个步骤让你的Windows任务栏焕然一新:透明化改造全攻略

5个步骤让你的Windows任务栏焕然一新&#xff1a;透明化改造全攻略 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一款轻…...