Design Compiler工具学习笔记(6)

news/2024/5/2 17:12:06/文章来源:https://blog.csdn.net/qq_43045275/article/details/128007054


 


目录

引言

知识储备

实际操作

设计源码

仿真源码

VCS执行仿真

DC 综合






引言

本篇继续学习 DC的基本使用。本篇主要学习 DC 综合之后的效果分析,重点在时序分析。

前文链接:

Design Compiler工具学习笔记(1)

Design Compiler工具学习笔记(2)

Design Compiler工具学习笔记(3)

Design Compiler工具学习笔记(4)

Design Compiler工具学习笔记(5)



知识储备

 小数点精度位数一般为 13 (-significant_digits)

 report_timing ::仅报告最差的路径时序;

report_timing -max_paths 2 :报告出两条最差的路径,但是这两条路径的终点不同

report_timing -nworst 2 -max_paths 2:报告出整个设计中最差的两条路径,可以是同一个终点

 建立时间违规必须全部修改,面积违规和保持时间违规可以保留。

出现违规时可能的情况:输入/出延迟过大,约束过紧;设计的组合逻辑部分延迟过大。

  





实际操作

以单比特信号以握手方式完成时钟域跨越。

设计源码

// |===================================== TOP ==============================
// |Author:Xu Y. B.
// |Date:2022-11-23
// |Description: TOP module 
// |			 about single bit signal CDC using handshake mode
// |			 CDC:100MHz-->50MHz
// |========================================================================module TOP (
// ======================= module input ports specify ================== 
// time domain 100MHz
input 						I_CLK_100M,
input 						I_RSTN_100M,// time domain 200MHz
input 						I_CLK_50M,
input 						I_RSTN_50M,// operate enable
input 						I_OPR_EN,//high,start 1 CDC test// ======================= module output ports specify ================== 
output 		reg 			O_CDC_DONE);
// ======================= module local parameters =====================// ======================= module internal signals =====================
// register input signal I_OPR_EN  
reg 						[1:0]				R_I_OPR_EN;
wire 											W_I_OPR_EN_PDG;
reg 											R_CDC_QST_100M;
reg 						[1:0]				R_CDC_QST_50M;reg 											R_CDC_ACK_50M;
reg 						[1:0]				R_CDC_ACK_100M;// ======================= module design logic =========================
always @ (posedge I_CLK_100M)
begin:pro_opr_en_regif(~I_RSTN_100M)beginR_I_OPR_EN <= 2'b00;endelsebeginR_I_OPR_EN[0] <= I_OPR_EN;R_I_OPR_EN[1] <= R_I_OPR_EN[0];end
endassign W_I_OPR_EN_PDG = R_I_OPR_EN[0] & (~R_I_OPR_EN[1]);always @ (posedge I_CLK_100M)
beginif(~I_RSTN_100M)beginR_CDC_QST_100M <= 0;endelsebeginif(W_I_OPR_EN_PDG)beginR_CDC_QST_100M <= 1;endelse if(R_CDC_ACK_100M[1])beginR_CDC_QST_100M <= 0;endelsebeginR_CDC_QST_100M <= R_CDC_QST_100M;endend
endalways @ (posedge I_CLK_100M)
beginif(~I_RSTN_100M)beginR_CDC_ACK_100M <=2'b0;endelsebeginR_CDC_ACK_100M[0] <= R_CDC_ACK_50M;R_CDC_ACK_100M[1] <= R_CDC_ACK_100M[0];end
end// 50M
always @ (posedge I_CLK_50M)
beginif(~I_RSTN_50M)beginR_CDC_ACK_50M <= 0;endelsebeginif(R_CDC_QST_50M[1])beginR_CDC_ACK_50M <= 1;endelsebeginR_CDC_ACK_50M <= 0;endend
endalways @ (posedge I_CLK_50M)
beginif(~I_RSTN_50M)beginR_CDC_QST_50M <= 2'b00;endelsebeginR_CDC_QST_50M[0] <= R_CDC_QST_100M;R_CDC_QST_50M[1] <= R_CDC_QST_50M[0];end
endalways @ (posedge I_CLK_100M)
beginif(~I_RSTN_100M)beginO_CDC_DONE <= 0;endelsebeginif(R_CDC_ACK_100M)beginO_CDC_DONE <= 1;endelsebeginO_CDC_DONE <= 0;endend
endendmodule

仿真源码

// |========================== Test Bench ===========================
// |Author:Xu Y. B.
// |Date:2022-11-23
// |Description: TOP module 
// |			 about single bit signal CDC using handshake mode
// |			 CDC:100MHz-->50MHz
// |			 Test Bench
// |==================================================================module TB ();// time domain 100MHz
reg 						I_CLK_100M;
reg 						I_RSTN_100M;// time domain 200MHz
reg 						I_CLK_50M;
reg 						I_RSTN_50M;// operate enable
reg 						I_OPR_EN;//high,start 1 CDC test// ======================= module output ports specify ================== 
wire			 			O_CDC_DONE;// ======================= generate clocks ==============================
initial I_CLK_100M = 0;
always #5 I_CLK_100M = ~I_CLK_100M;initial I_CLK_50M = 0;
always #10 I_CLK_50M = ~I_CLK_50M;initial
beginI_RSTN_100M = 0;I_RSTN_50M = 0;I_OPR_EN = 0;#20;I_RSTN_100M = 1;#40;I_RSTN_50M = 1;#20;I_OPR_EN = 1;@(negedge O_CDC_DONE)#50;$finish;
endinitial
begin`ifdef VPD_TEST$vcdpluson();`endif
endTOP INST_TOP(.I_CLK_100M  (I_CLK_100M),.I_RSTN_100M (I_RSTN_100M),.I_CLK_50M   (I_CLK_50M),.I_RSTN_50M  (I_RSTN_50M),.I_OPR_EN    (I_OPR_EN),.O_CDC_DONE  (O_CDC_DONE));endmodule

VCS执行仿真

makefile 文件:

# =======================================================
# ========================== MAKE FILE ==================
# By:Xu Y. B.
# Date:2022-11-23
# Note:
# reuse this makefile ,the followings should be changed:
# -1- OUTPUT
# -2- TB file add the following:
# 	  `ifdef VPD_TEST
# 			$vcdpluson();
# 	  `endif
# =======================================================.PHONY: com cov clean debugOUTPUT = SIMV_CDC_TESTVPD_SW_DEFINE = +define+VPD_TEST# code coverage command
CM = -cm line+cond+fsm+branch+tgl
CM_NAME = -cm_name $(OUTPUT)
CM_DIR = -cm_dir ./$(OUTPUT).vdb# vpdfile name
VPD_NAME = $(OUTPUT).vpd# compile command
VCS = vcs -full64 -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed   \-simprofile 							 \-sverilog +v2k -timescale=1ns/1ns      \-debug_access+r 	             		 \-Mupdate								 \+notimingcheck			     		 \+nospecify			                 \+vcs+flush+all			             \$(VPD_SW_DEFINE)						 \-o $(OUTPUT)							 \-l compile.log						 # $(CM)				                 	 \# $(CM_NAME)							 \# $(CM_DIR)								 
# -cm_hier ./vcs_cov.cfg# simulation command
SIM = ./$(OUTPUT)							 \-l $(OUTPUT).log						 \$(CM) $(CM_NAME) $(CM_DIR)	         \$(VPD_NAME)							 \# start complie
com:	find -name "*.v" >filelist.f $(VCS) -f filelist.f# start simulation
sim:$(SIM)mv vcdplus.vpd $(VPD_NAME)# show the coverage
cov:dve -full64 -covdir *.vdb &
debug:dve -full64 -vpd $(OUTPUT).vpd &# start clean
clean:rm -rf ./csrc *.daidir *.log *.vpd *.vdb simv* *.key *race.out* *.so.* *profile* *.f

DC 综合

脚本:

供参考~~~~~~~~~~

# |===========================================================
# | Author 		: Xu Y. B.
# | Date   		: 2022-11-21
# | Description : tcl script for top design 
# |===========================================================# |===========================================================
# |STEP 1: Read & elaborate the RTL design file list & check
# |===========================================================
set TOP_MODULE CDC_TOP
analyze        -format verilog [list CDC_TOP.v ]
elaborate      $TOP_MODULE     -architecture verilog
current_design $TOP_MODULEif {[link] == 0} {echo "Your Link has errors !";exit;
}if {[check_design] == 0} {echo "Your check design has errors !";exit;
}# |===========================================================
# |STEP 2: reset design
# |===========================================================
reset_design# |===========================================================
# |STEP 3: Write unmapped ddc file
# |===========================================================
uniquify
set uniquify_naming_style "%s_%d"
write -f ddc -hierarchy -output ${UNMAPPED_PATH}/${TOP_MODULE}.ddc# |===========================================================
# |STEP 4: define clocks
# |===========================================================
# -------------------------- CLK 100MHz ----------------------
set       CLK_NAME          	I_CLK_100M
set       CLK_PERIOD        	10
set       CLK_SKEW	        	[expr {$CLK_PERIOD*0.05}]						
set       CLK_TRANS         	[expr {$CLK_PERIOD*0.01}]						
set       CLK_SRC_LATENCY   	[expr {$CLK_PERIOD*0.1 }]						
set       CLK_LATENCY       	[expr {$CLK_PERIOD*0.1 }]						create_clock 			-period 	$CLK_PERIOD  	  [get_ports $CLK_NAME]
set_ideal_network 						 			  [get_ports $CLK_NAME]
set_dont_touch_network 					 			  [get_ports $CLK_NAME]
set_drive 				0 							  [get_ports $CLK_NAME]set_clock_uncertainty   -setup       $CLK_SKEW        [get_clocks $CLK_NAME]
set_clock_transition    -max         $CLK_TRANS       [get_clocks $CLK_NAME]
set_clock_latency       -source -max $CLK_SRC_LATENCY [get_clocks $CLK_NAME]
set_clock_latency       -max         $CLK_LATENCY     [get_clocks $CLK_NAME]# --------------------------- CLK 50MHz ----------------------
set       CLK_NAME_2          	I_CLK_50M
set       CLK_PERIOD_2        	20
set       CLK_SKEW_2	        [expr {$CLK_PERIOD_2*0.05}]						
set       CLK_TRANS_2         	[expr {$CLK_PERIOD_2*0.01}]						
set       CLK_SRC_LATENCY_2   	[expr {$CLK_PERIOD_2*0.1 }]						
set       CLK_LATENCY_2       	[expr {$CLK_PERIOD_2*0.1 }]						create_clock 			-period 	$CLK_PERIOD_2  	  [get_ports $CLK_NAME_2]
set_ideal_network 						 			  [get_ports $CLK_NAME_2]
set_dont_touch_network 					 			  [get_ports $CLK_NAME_2]
set_drive 				0 							  [get_ports $CLK_NAME_2]set_clock_uncertainty   -setup       $CLK_SKEW_2        [get_clocks $CLK_NAME_2]
set_clock_transition    -max         $CLK_TRANS_2       [get_clocks $CLK_NAME_2]
set_clock_latency       -source -max $CLK_SRC_LATENCY_2 [get_clocks $CLK_NAME_2]
set_clock_latency       -max         $CLK_LATENCY_2     [get_clocks $CLK_NAME_2]# |===========================================================
# |STEP 5: define reset
# |===========================================================
# ------------------------- RST 1 ----------------------------
set RST_NAME 					I_RSTN_100M
set_ideal_network 				[get_ports $RST_NAME]
set_dont_touch_network          [get_ports $RST_NAME]
set_drive             0         [get_ports $RST_NAME]# ------------------------- RST 2 ----------------------------
set RST_NAME_2 					I_RSTN_50M
set_ideal_network 				[get_ports $RST_NAME_2]
set_dont_touch_network          [get_ports $RST_NAME_2]
set_drive             0         [get_ports $RST_NAME_2]# |===========================================================
# |STEP 6: set input delay using timing budget
# |Assume a weak cell to drive the input pins
# |===========================================================
set 		LIB_NAME 			typical
set 		WIRE_LOAD_MODEL 	smic18_wl10
set 		DRIVE_CELL 			INVX1
set 		DRIVE_CELL_2 		INVX4
set 		DRIVE_CELL_3		INVX8set 		DRIVE_PIN 			Y
set 		OPERATE_CONDITION   typicalset 		INPUT_RST 			 [get_ports I_RSTN_100M]
set 		INPUT_RST_2			 [get_ports I_RSTN_50M]set         INPUT_DELAY 		 [expr {$CLK_PERIOD*0.6}]
set         INPUT_DELAY_2 		 [expr {$CLK_PERIOD_2*0.6}]
# CLK 1
set_input_delay $INPUT_DELAY -clock $CLK_NAME [get_ports I_OPR_EN]
set_input_delay $INPUT_DELAY -clock $CLK_NAME ${INPUT_RST}# CLK 2
set_input_delay $INPUT_DELAY_2 -clock $CLK_NAME_2 ${INPUT_RST_2}# DRIVE CELL
set_driving_cell -lib_cell ${DRIVE_CELL}   -pin ${DRIVE_PIN}   ${INPUT_RST}
set_driving_cell -lib_cell ${DRIVE_CELL_2} -pin ${DRIVE_PIN}   ${INPUT_RST_2}
set_driving_cell -lib_cell ${DRIVE_CELL_3} -pin ${DRIVE_PIN}   [get_ports I_OPR_EN]# |===========================================================
# |STEP 7: set output delay 
# |===========================================================
set OUTPUT_DELAY  [expr {$CLK_PERIOD*0.6}]
set MAX_LOAD      [expr {[load_of $LIB_NAME/INVX4/A] * 10}]set_output_delay  $OUTPUT_DELAY -clock $CLK_NAME 	 [all_outputs]
set_load 		  [expr {$MAX_LOAD * 3}] 			 [all_outputs]
set_isolate_ports -type buffer 					 	 [all_outputs]# |===========================================================
# |STEP 8: set max delay for comb logic 
# |===========================================================
# set_input_delay  [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports I_1]
# set_output_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports O_1]# |===========================================================
# |STEP 9: set operating condition & wire load model 
# |===========================================================
set_operating_conditions -max 			$OPERATE_CONDITION \-max_library 	$LIB_NAMEset 					 auto_wire_load_selection false
set_wire_load_mode  	 top
set_wire_load_model		 -name    $WIRE_LOAD_MODEL \-library $LIB_NAME# |===========================================================
# |STEP 10: set area constraint (Let DC try its best) 
# |===========================================================
set_max_area			 1000# |===========================================================
# |STEP 11: set DRC constraint 
# |===========================================================
# set MAX_CAPACITANCE [expr {[load_of $LIB_NAME/NAND4X2/Y] * 5}]
# set_max_capacitance $MAX_CAPACITANCE $ALL_INPUT_EXCEPT_CLK# |===========================================================
# |STEP 12: set group path
# |Avoid getting stack on one path
# |===========================================================
# group_path -name $CLK_NAME -weight 5 				\
# 						   -critical_range  [expr {$CLK_PERIOD * 0.1}] # group_path -name INPUTS    -from [all_inputs] 		\
# 					 	   -critical_range  [expr {$CLK_PERIOD * 0.1}] # group_path -name OUTPUTS   -to [all_outputs] 		\
# 						   -critical_range  [expr {$CLK_PERIOD * 0.1}] # group_path -name COMBS     -from [all_inputs] 		\
# 						   -to [all_outputs] 		\
# 						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 	
# report_path_group# |===========================================================
# |STEP 13: Elimate the multiple-port inter-connect &
# |			define name style
# |===========================================================
# set_app_var 						verilogout_no_tri 					true
# set_app_var						verilogout_show_unconnected_pins 	true
# set_app_var						bus_naming_style					{%s[%d]}
# simplify_constants 				-boundary_optimization
# set_boundary_optimization 		[current_design] 					true
# set_fix_multiple_port_nets 		-all 								-buffer_constants# |===========================================================
# |STEP 14: timing exception define
# |===========================================================
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set ALL_CLKS [all_clocks]
# foreach_in_collection CUR_CLK $ALL_CLKS 
# {
# 	set OTHER_CLKS [remove_from_collection [all_clocks] $CUR_CLK]
# 	set_false_path -from $CUR_CLK $OTHER_CLKS
# }# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]# set_disable_timing TOP/U1 -from a -to y
# set_case_analysis 0 [get_ports sel_i]# set_multicycle_path -setup 6 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -hold 5 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -setup 2 -to FFB/D
# set_multicycle_path -hold 1 -to FFB/D# |===========================================================
# |STEP 15: compile flow
# |===========================================================
# ungroup -flatten -all# 1st-pass compile
# compile -map_effort high -area_effort high
# compile -map_effort high -area_effort high -boundary_optimization
compile # simplify_constants -boundary_optimization
# set_fix_multiple_port_nets -all -buffer_constants# compile -map_effort high -area_effort high -incremental_mapping -scan# 2nd-pass compile
# compile -map_effort high -area_effort high -incremental_mapping -boundary_optimization
# compile_ultra -incr# |===========================================================
# |STEP 16: write post-process files
# |===========================================================
# change_names -rules verilog -hierarchy
# remove-unconnected_ports [get_cells -hier *] -blast_buses
# Write the mapped files
write -f ddc -hierarchy -output $MAPPED_PATH/${TOP_MODULE}.ddc
# write 	-f verilog 	-hierarchy -output 	$MAPPED_PATH/${TOP_MODULE}.v
# write_sdc -version 	1.7 				$MAPPED_PATH/${TOP_MODULE}.sdc
# write_sdf -version 	2.1 				$MAPPED_PATH/${TOP_MODULE}.sdf# |===========================================================
# |STEP 17: generate report files
# |===========================================================

在完成编译之后可以用本篇的PPT里面介绍的 时序报告指令进行时序分析。此处不再赘述。

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

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

相关文章

cubeIDE开发, stm32的OLED点亮及字符显示设计(基于SPI通信)

一、SPI 通信技术 显示屏&#xff08;LCD、OLED&#xff09;接口一般有I2C、SPI、UART、RGB、LVDS、MIPI、EDP和DP等。一般3.5寸以下的小尺寸LCD屏&#xff0c;显示数据量比较少&#xff0c;普遍采用低速串口&#xff0c;如I2C、SPI、UART。SPI&#xff08;Serial Peripheral I…

css-实现卡牌的发牌和翻转动画

场景描述&#xff1a; 打开抽卡界面&#xff0c;卡牌出现并发牌至固定的位置&#xff0c;此时展示的是卡牌的背面&#xff1b;用户点击卡牌时&#xff0c;卡牌进行翻转&#xff0c;并展示卡牌内容&#xff0c;或者发牌后自动进行翻转和展示。 本实例在页面挂载后自动播放动画&…

systemd 252 如预期的锁定了 Linux 引导过程

导读今天给大家介绍一下systemd 252锁定 Linux 引导过程systemd 252 如预期的锁定了 Linux 引导过程 之前&#xff0c;我们 报道 过&#xff0c;systemd 创始人发文指出 Linux 引导过程不安全&#xff0c;并提出采用加密签名的统一内核镜像&#xff08;UKI&#xff09;&#x…

linux搭建git服务器,windows客户端配置git

Linux服务器配置之Git服务器搭建步骤&#xff1a; 一、配置环境 1、服务器&#xff1a;CentOS 8.2&#xff08;64位&#xff09; Git &#xff08;version 2.27.0&#xff09; 2、客户端&#xff1a;Windows 10 &#xff08;64位&#xff09; Git&#xff08;version 2.38.…

Actipro Windows Forms Controls 22.1.3 注册版

Actipro Windows Forms Controls 窗体控件 一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件 语法编辑器 语法高亮代码编辑器控件和解析套件。 为您自己的应用程序带来类似于 Visual Studio 的强大代码编辑体验&#xff0c;以及流行代码编辑器中的所有高级功能。大多数流…

C#程序采用AOT发布,真的可以避免被反编译?

上次跟大家分享过&#xff0c;C#程序反编译与篡改代码的教程《C#程序发布时&#xff0c;一定要好好的保护&#xff0c;不然你会后悔的&#xff01;》&#xff0c;根据这个教程&#xff0c;我们都知道C#程序&#xff0c;发布后必须进行加密混淆&#xff0c;不然就是相当于源码直…

Redis基础命令(set类型)交集并集差集

目录 概述: 特征&#xff1a; Set常见命令&#xff1a; 1.Sadd key number..&#xff1a;向set中添加一个或多个元素 2.Srem key number...&#xff1a;移除set中指定的元素 3.Scard key&#xff1a;返回set中元素的个数 4.Sismember key member&#xff1a;判断一个元素…

html实现好看的导航主页(附源码)

文章目录1.设计来源1.1 主界面1.2 底部导航1.3 屏幕保护2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128028326 html实现好看的导航主页(附源码) html实现好看的导航主页&…

小小王总,如何变成任正非、化腾、强东这样的巨人!

原创&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;&#xff0c;欢迎分享&#xff0c;非公众号转载保留此声明。王总特别迷信外面的企业培训。当遇到问题时&#xff0c;他喜欢去取经。这个经不像唐僧取经一样&#xff0c;需要历经九九八十一难…

谱本征正交分解 (SPOD)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

python下载安装教程

1、下载python 下载地址&#xff1a;https://www.python.org/&#xff0c;点击Downloads,选择对应电脑系统&#xff0c;进行下载。 &#xff08;文末送读者福利&#xff09; 2、安装python&#xff0c;以python3.10.7安装为例。 &#xff08;1&#xff09;双击安装包&#x…

[ Linux ] 进程间通信之共享内存

在上篇博文我们了解了通过管道完成进程间通信&#xff0c;我们了解匿名管道和命名管道&#xff0c;并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先看到同一份资源&#xff0c;因此给予这个前提&#xff0c;本篇博文我们了解另…

Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

目录一、内存溢出时自动导出 .hprof 文件二、下载安装 MAT三、启动 MAT四、MAT 分析 hprof 文件1.Overview 概览2.Leak Suspects 溢出原因猜测3.Histogram 对象实例数量排序4.Dominator Tree 支配树.hprof 文件&#xff1a; 是 java 项目的 Heap Dump 文件&#xff0c;也叫内存…

基于JAVA的新闻发布管理系统开发参考【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427655 目的 本系统的目的是实现新闻发布系统的基本功能。新闻发布系统提供了不同类型新闻&#xff08;如社会新闻、娱乐新闻和技术前沿新闻等&#xff09; 满足不同用户需求&#xff1b;系…

简述供应商管理SRM系统

简道云SRM管理系统供应商关系管理(SRM系统)&#xff0c;是企业可以用来对供应商的优势和能力进行系统的、全行业范围的评估&#xff0c;涉及企业整体的商业战略&#xff0c;供应商寻源、采购审批、比价、招投标管理、订单执行、库存可视化管理、财务支付审批对账、供应商绩效评…

Steam项目推进 (一) ——项目情况简述

一、前言 之前跟一个策划朋友一起做过一个小项目Demo&#xff0c;然后中止了大半年&#xff0c;现在想继续把这个项目推进下去。又怕自制力不够&#xff0c;所以建立一个栏目来记录这个项目的推进情况&#xff0c;记忆在项目中学习到的东西。 二、目前的项目情况 1、项目定位…

Flutter高仿微信-第32篇-单聊-语音

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取语音聊天实…

基于遥感和GIS技术的生态承载力评价的解决方案

生态承载力的概念最早来自于生态学。1921年&#xff0c;Park和Burgess在生态学领域中首次应用了生态承载力的概念&#xff0c;即在某一特定环境条件下&#xff08;主要指生存空间、营养物质、阳光等生态因子的组合&#xff09;&#xff0c;某种个体存在数量的最高极限。生态承载…

APP到底有没有权限-恶意拷贝删除照片

作者&#xff1a;黑蛋 近期发生了一件比较恶劣的事情&#xff0c;某客户在某物上面买了一件东西&#xff0c;但是这个东西是假货&#xff0c;所以客户致电某物人工客服&#xff0c;并进行了录音&#xff0c;这时候某物试图通过自身的客户端软件&#xff0c;去删除客户手机上的…

Python字符串及正则表达式

一&#xff1a; 字符串可以用单引号或双引号来创建&#xff0c;也可以用三引号来创建多行字符串。 String_1 加快发展 String_2 "促进生产" String_3 """吾家吾国&#xff0c; 吾家吾国&#xff0c; 吾家吾国&#xff0c; 吾家吾国。""…