Design Compiler工具学习笔记(4)

news2024/12/23 10:27:33


目录

引言

知识储备

实际操作

设计源码

Vivado2018.3仿真

VCS2016仿真

Tcl脚本

约束脚本 MY_TOP.tcl

运行脚本 RUN.tcl



引言

本篇继续学习 DC的基本使用。本篇主要学习 DC 需要的环境约束。

前文链接:

Design Compiler工具学习笔记(1)

Design Compiler工具学习笔记(2)

Design Compiler工具学习笔记(3)



知识储备

 


  




 

 

实际操作

设计源码

此处做一个简单的运算模块,实现 (A+B)*C-D

其中,A、B、C、D的位宽可变

子模块源码:

// ================== calculate A & B  module ==========================  
// Date:2022-11-20
// By:Xu Y. B.
// Description:
// 				FNUC == 0 : A+B;
// 				FUNC == 1 : A-B;
// 				FUNC == 2 : A*B;
// =====================================================================  

module CAL_FUNC_MDL #(

// ======================= module parameters specify ===================  
parameter 			P_DATA_A_WIDTH 		=	8,
parameter 			P_DATA_B_WIDTH      =   4
)(
// ======================= module iuput ports specify ==================  
input 										I_CLK_100M,
input 										I_RSTN,
input 				[P_DATA_A_WIDTH-1:0]    I_DATA_A,
input 				[P_DATA_B_WIDTH-1:0]    I_DATA_B,
input 										I_DATA_A_VAL,
input 										I_DATA_B_VAL,
input 				[1:0]					I_FUNC,

// ======================= module output ports specify =================  
output 				[P_DATA_A_WIDTH+P_DATA_B_WIDTH-1:0]	O_CAL_RES,
output										O_CAL_RES_VAL

);

// ======================= module local parameters =====================
localparam 			LP_ADD_SUB_RES_WIDTH =	MAX(P_DATA_B_WIDTH,P_DATA_A_WIDTH) + 1;
localparam			LP_MULT_RES_WIDTH	 =  P_DATA_A_WIDTH+P_DATA_B_WIDTH;

// ======================= module internal signals =====================
reg 				[LP_ADD_SUB_RES_WIDTH-1:0]	R_ADD_SUB_RES;
reg 				[LP_MULT_RES_WIDTH-1:0]		R_MULT_RES;
reg 											R_CAL_RES_VAL;

reg 				[1:0]						R_FUNC;

// ======================= module logic ================================
always @ (posedge I_CLK_100M)
begin:cal 
	if(~I_RSTN)
	begin
		R_ADD_SUB_RES <= {(LP_ADD_SUB_RES_WIDTH){1'b0}};
		R_MULT_RES 	  <= {(LP_MULT_RES_WIDTH){1'b0}};
		R_CAL_RES_VAL <= 1'b0;
	end
	else
	begin
		if(I_DATA_A_VAL & I_DATA_B_VAL)
		begin
			case (I_FUNC)
				0:
				begin
					R_ADD_SUB_RES <=  {{(LP_ADD_SUB_RES_WIDTH-P_DATA_A_WIDTH){I_DATA_A[P_DATA_A_WIDTH-1]}},I_DATA_A} 
									+ {{(LP_ADD_SUB_RES_WIDTH-P_DATA_B_WIDTH){I_DATA_B[P_DATA_B_WIDTH-1]}},I_DATA_B};
					R_MULT_RES 	  <= {(LP_MULT_RES_WIDTH){1'b0}};
					R_CAL_RES_VAL <= 1'b1;
				end
				1:
				begin
					R_ADD_SUB_RES <=  {{(LP_ADD_SUB_RES_WIDTH-P_DATA_A_WIDTH){I_DATA_A[P_DATA_A_WIDTH-1]}},I_DATA_A} 
									- {{(LP_ADD_SUB_RES_WIDTH-P_DATA_B_WIDTH){I_DATA_B[P_DATA_B_WIDTH-1]}},I_DATA_B};
					R_MULT_RES 	  <= {(LP_MULT_RES_WIDTH){1'b0}};
					R_CAL_RES_VAL <= 1'b1;
				end
				2:
				begin
					R_ADD_SUB_RES <= {(LP_ADD_SUB_RES_WIDTH){1'b0}};
					R_MULT_RES 	  <= {{(P_DATA_B_WIDTH){I_DATA_A[P_DATA_A_WIDTH-1]}},I_DATA_A} 
									* 
									 {{(P_DATA_A_WIDTH){I_DATA_B[P_DATA_B_WIDTH-1]}},I_DATA_B};
					R_CAL_RES_VAL <= 1'b1;
				end
				default : 
				begin
					R_ADD_SUB_RES <=  {{(LP_ADD_SUB_RES_WIDTH-P_DATA_A_WIDTH){I_DATA_A[P_DATA_A_WIDTH-1]}},I_DATA_A} 
									+ {{(LP_ADD_SUB_RES_WIDTH-P_DATA_B_WIDTH){I_DATA_B[P_DATA_B_WIDTH-1]}},I_DATA_B};
					R_MULT_RES 	  <= {(LP_MULT_RES_WIDTH){1'b0}};
					R_CAL_RES_VAL <= 1'b1;
				end
			endcase
		end
		else
		begin
			R_ADD_SUB_RES <= {(LP_ADD_SUB_RES_WIDTH){1'b0}};
			R_MULT_RES 	  <= {(LP_MULT_RES_WIDTH){1'b0}};
			R_CAL_RES_VAL <= 1'b0;			
		end
	end
end

always @ (posedge I_CLK_100M)
begin:beat
	if(~I_RSTN)
	begin
		R_FUNC <= 2'd0;
	end
	else
	begin
		R_FUNC <= I_FUNC;
	end
end

assign O_CAL_RES_VAL = R_CAL_RES_VAL;
assign O_CAL_RES = (R_FUNC < 2) ? {{(LP_MULT_RES_WIDTH-LP_ADD_SUB_RES_WIDTH){R_ADD_SUB_RES[LP_ADD_SUB_RES_WIDTH-1]}},R_ADD_SUB_RES}
								: R_MULT_RES;


// function define
function integer MAX;
 input integer A, B;
 begin
 	if(A>=B)
 	begin
 		MAX = A;
 	end
 	else
 	begin
 		MAX = B;
 	end
 end
endfunction
endmodule

顶层文件:

// ================== TOP  module ==========================  
// Date:2022-11-20
// By:Xu Y. B.
// Description:
// 				(A+B)*C-D
// =========================================================

module TOP #(
// ======================= module parameters specify ===================  
parameter 		P_DATA_A_WIDTH				=	2,
parameter 		P_DATA_B_WIDTH  			=   4,
parameter 		P_DATA_C_WIDTH				=	5,
parameter 		P_DATA_D_WIDTH  			=   8
)(
// ======================= module iuput ports specify ================== 

input 										I_CLK_100M,    // clock
input 										I_RSTN,        // synchronous reset active low

input 			[P_DATA_A_WIDTH-1:0]		I_DATA_A,
input 			[P_DATA_B_WIDTH-1:0]		I_DATA_B,
input 			[P_DATA_C_WIDTH-1:0]		I_DATA_C,
input 			[P_DATA_D_WIDTH-1:0]		I_DATA_D,

input 										I_DATA_VAL,


// ======================= module output ports specify =================
output	[MAX(MAX(P_DATA_A_WIDTH,P_DATA_B_WIDTH)+1+P_DATA_C_WIDTH,
		P_DATA_D_WIDTH):0] 				O_CAL_RES,
output 										O_CAL_RES_VAL 

);
// ======================= module local parameters =====================
localparam 		LP_ADD_RES_WIDTH	=	MAX(P_DATA_A_WIDTH,P_DATA_B_WIDTH)+1;
localparam 		LP_MULT_RES_WIDTH	=	LP_ADD_RES_WIDTH + P_DATA_C_WIDTH;
localparam 		LP_SUB_RES_WIDTH	=	MAX(LP_MULT_RES_WIDTH,P_DATA_D_WIDTH)+1;
// ======================= module internal signals =====================
wire 			[LP_ADD_RES_WIDTH-1:0]	W_ADD_RES;
wire 									W_ADD_RES_VAL;
wire 			[LP_MULT_RES_WIDTH-1:0] W_MULT_RES;
wire 									W_MULT_RES_VAL;
wire 			[LP_SUB_RES_WIDTH-1:0]	W_SUB_RES;
wire 									W_SUB_RES_VAL;

reg 			[P_DATA_C_WIDTH-1:0] 	R_DATA_C;
reg 									R_DATA_C_VAL;

reg 			[P_DATA_D_WIDTH-1:0]	R_DATA_D[1:0];
reg 			[1:0]					R_DATA_D_VAL;
// ======================= module logic ================================

// instantiate module
// ADD
CAL_FUNC_MDL #(
		.P_DATA_A_WIDTH(P_DATA_A_WIDTH),
		.P_DATA_B_WIDTH(P_DATA_B_WIDTH)
	) INST_CAL_FUNC_MDL_ADD (
		.I_CLK_100M    (I_CLK_100M),
		.I_RSTN        (I_RSTN),
		.I_DATA_A      (I_DATA_A),
		.I_DATA_B      (I_DATA_B),
		.I_DATA_A_VAL  (I_DATA_VAL),
		.I_DATA_B_VAL  (I_DATA_VAL),
		.I_FUNC        (2'd0),
		.O_CAL_RES     (W_ADD_RES),
		.O_CAL_RES_VAL (W_ADD_RES_VAL)
	);
// MULT
always @ (posedge I_CLK_100M)
begin:delay_c
	if(~I_RSTN)
	begin
		R_DATA_C_VAL <= 0;
		R_DATA_C <= 0;
	end
	else
	begin
		R_DATA_C <= I_DATA_C;
		R_DATA_C_VAL <= I_DATA_VAL;
	end
end
CAL_FUNC_MDL #(
		.P_DATA_A_WIDTH(LP_ADD_RES_WIDTH),
		.P_DATA_B_WIDTH(P_DATA_C_WIDTH)
	) INST_CAL_FUNC_MDL_MULT (
		.I_CLK_100M    (I_CLK_100M),
		.I_RSTN        (I_RSTN),
		.I_DATA_A      (W_ADD_RES),
		.I_DATA_B      (R_DATA_C),
		.I_DATA_A_VAL  (W_ADD_RES_VAL),
		.I_DATA_B_VAL  (R_DATA_C_VAL),
		.I_FUNC        (2'd2),
		.O_CAL_RES     (W_MULT_RES),
		.O_CAL_RES_VAL (W_MULT_RES_VAL)
	);

// SUB
always @ (posedge I_CLK_100M)
begin:delay_d
	if(~I_RSTN)
	begin
		R_DATA_D_VAL <= 2'b00;
		R_DATA_D[0] <= 0;
		R_DATA_D[1] <= 0;
	end
	else
	begin
		R_DATA_D_VAL[0] <= I_DATA_VAL;
		R_DATA_D_VAL[1] <= R_DATA_D_VAL[0];
		R_DATA_D[0] 	<= I_DATA_D;
		R_DATA_D[1]		<= R_DATA_D[0];
	end
end
CAL_FUNC_MDL #(
		.P_DATA_A_WIDTH(LP_MULT_RES_WIDTH),
		.P_DATA_B_WIDTH(P_DATA_D_WIDTH)
	) INST_CAL_FUNC_MDL_SUB (
		.I_CLK_100M    (I_CLK_100M),
		.I_RSTN        (I_RSTN),
		.I_DATA_A      (W_MULT_RES),
		.I_DATA_B      (R_DATA_D[1]),
		.I_DATA_A_VAL  (W_MULT_RES_VAL),
		.I_DATA_B_VAL  (R_DATA_D_VAL[1]),
		.I_FUNC        (2'd1),
		.O_CAL_RES     (W_SUB_RES),
		.O_CAL_RES_VAL (W_SUB_RES_VAL)
	);

assign O_CAL_RES = W_SUB_RES;
assign O_CAL_RES_VAL = W_SUB_RES_VAL;

// function define
function integer MAX;
 input integer A, B;
 begin
 	if(A>=B)
 	begin
 		MAX = A;
 	end
 	else
 	begin
 		MAX = B;
 	end
 end
endfunction



endmodule

仿真文件:

// ================== calculate A & B  module TestBench=================
// Date:2022-11-20
// By:Xu Y. B.
// Description:
// 				FNUC == 0 : A+B;
// 				FUNC == 1 : A-B;
// 				FUNC == 2 : A*B;
// =====================================================================  


module TB ();

// ======================= module parameters specify ===================  
localparam 		P_DATA_A_WIDTH				=	2;
localparam 		P_DATA_B_WIDTH  			=   4;
localparam 		P_DATA_C_WIDTH				=	5;
localparam 		P_DATA_D_WIDTH  			=   8;

// ======================= module iuput ports specify ================== 

reg 										I_CLK_100M;    // clock
reg 										I_RSTN;        // synchronous reset active low

reg 			[P_DATA_A_WIDTH-1:0]		I_DATA_A;
reg 			[P_DATA_B_WIDTH-1:0]		I_DATA_B;
reg 			[P_DATA_C_WIDTH-1:0]		I_DATA_C;
reg 			[P_DATA_D_WIDTH-1:0]		I_DATA_D;

reg 										I_DATA_VAL;


// ======================= module output ports specify =================
wire	[MAX(MAX(P_DATA_A_WIDTH,P_DATA_B_WIDTH)+1+P_DATA_C_WIDTH,
		P_DATA_D_WIDTH):0] 				    O_CAL_RES;
wire 										O_CAL_RES_VAL ;

// ======================= generate clock ==============================
initial I_CLK_100M = 0;
always #5 I_CLK_100M = ~I_CLK_100M;

initial
begin
	I_RSTN = 1'b0;
	I_DATA_A <= 0;
	I_DATA_B <= 0;
	I_DATA_C <= 0;
	I_DATA_D <= 0;
	I_DATA_VAL = 0;

	#20;

	I_RSTN = 1;

	#10;

	@(posedge I_CLK_100M)
	I_DATA_A = 2'd1;
	I_DATA_B = -4'd6;
	I_DATA_C = -5'd2;
	I_DATA_D = 8'd100;
	I_DATA_VAL <= 1;	

	@(posedge I_CLK_100M)
	I_DATA_VAL <= 0;
	I_DATA_A <= 0;
	I_DATA_B <= 0;
	I_DATA_C <= 0;
	I_DATA_D <= 0;

	#10;
	@(posedge I_CLK_100M)
	I_DATA_A = -2'd1;
	I_DATA_B = 4'd6;
	I_DATA_C = -5'd2;
	I_DATA_D = 8'd66;
	I_DATA_VAL <= 1;

	@(posedge I_CLK_100M)
	I_DATA_VAL <= 0;
	I_DATA_A <= 0;
	I_DATA_B <= 0;
	I_DATA_C <= 0;
	I_DATA_D <= 0;

	@(negedge O_CAL_RES_VAL)
	#50;

	$display("TB END",`__FILE__,`__LINE__);

	$finish;

end

initial 
begin
	`ifdef VPD_TEST
		$vcdpluson();
	`endif
end


TOP #(
		.P_DATA_A_WIDTH(P_DATA_A_WIDTH),
		.P_DATA_B_WIDTH(P_DATA_B_WIDTH),
		.P_DATA_C_WIDTH(P_DATA_C_WIDTH),
		.P_DATA_D_WIDTH(P_DATA_D_WIDTH)
	) INST_TOP (
		.I_CLK_100M     (I_CLK_100M),
		.I_RSTN         (I_RSTN),
		.I_DATA_A       (I_DATA_A),
		.I_DATA_B       (I_DATA_B),
		.I_DATA_C       (I_DATA_C),
		.I_DATA_D       (I_DATA_D),
		.I_DATA_VAL     (I_DATA_VAL),
		.O_CAL_RES      (O_CAL_RES),
		.O_CAL_RES_VAL  (O_CAL_RES_VAL)
	);


// function define
function integer MAX;
 input integer A, B;
 begin
 	if(A>=B)
 	begin
 		MAX = A;
 	end
 	else
 	begin
 		MAX = B;
 	end
 end
endfunction

endmodule

Vivado2018.3仿真

VCS2016仿真

刚好复习一下 前段时间学习的 VCS使用。不了解的可以看本专栏前面关于 VCS 的文章:

Synosys Toolicon-default.png?t=M85Bhttps://blog.csdn.net/qq_43045275/category_12082114.html?spm=1001.2014.3001.5482

Tcl脚本

仅供参考~~~

约束脚本 MY_TOP.tcl

# |===========================================================
# | 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 TOP
analyze        -format verilog [list TOP.v CAL_FUNC_MDL.v]
elaborate      $TOP_MODULE     -architecture verilog
current_design $TOP_MODULE

if {[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
# |===========================================================
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]


# |===========================================================
# |STEP 5: define reset
# |===========================================================
set RST_NAME 					I_RSTN
set_ideal_network 				[get_ports $RST_NAME]
set_dont_touch_network          [get_ports $RST_NAME]
set_drive             0         [get_ports $RST_NAME]


# |===========================================================
# |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_PIN 			Y
set 		OPERATE_CONDITION   typical

set 		ALL_INPUT_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]
set         INPUT_DELAY 		 [expr {$CLK_PERIOD*0.6}]

set_input_delay $INPUT_DELAY -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
# set_input_delay -min 0 -clock $CLK_NAME $ALL_INPUT_EXCEPT_CLK
set_driving_cell -lib_cell ${DRIVE_CELL} -pin ${DRIVE_PIN} $ALL_INPUT_EXCEPT_CLK


# |===========================================================
# |STEP 7: set output delay 
# |===========================================================
set output_DELAY  [expr {$CLK_PERIOD*0.6}]
set MAX_LOAD      [expr {[load_of $LIB_NAME/INVX8/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_NAME

set 					 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			 0

# |===========================================================
# |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 $CLK_NAME -to [all_outputs] 		\
# 						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 

# group_path -name $CLK_NAME -from [all_inputs] 		\
# 						   -to [all_outputs] 		\
# 						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 					   

运行脚本 RUN.tcl

# source MY_TOP.tcl and print the process to terminal & run.log
redirect -tee -file ${WORK_PATH}/run.log {source -echo -verbose MY_TOP.tcl}

运行约束脚本,并将信息存放于log文件中。

 

 

 



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【苹果推iMessage位置推相册共享推送】软件安装上传到appstore都是需要的Activity

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

maxcompute优化慢执行语句思路

maxcompute慢执行任务优化如何锁定慢执行任务&#xff1f;判断是何种类型的慢任务如何锁定慢执行任务&#xff1f; 第一步&#xff1a;如果是周期任务可以通过任务执行日志中的LogView 链接查看 &#xff0c;如果是临时任务则通过maxcompute命令行 执行wait instanceId instanc…

现代密码学导论-2-古典密码及其密码分析

目录 1.3 古典密码和密码分析 1.3.1 凯撒密码 Caesar’s cipher 1.3.2 移位密码 shift cipher 1.3.3 充分密钥空间原则 1.3.4 单表代换密码 mono-alphabetic substitution cipher 1.3.5 利用字母频率对移位密码的一种改进攻击 1.3.6 维吉尼亚密码(多表代换密码)Vigenere…

Ansys Zemax | 使用 OpticStudio 进行闪光激光雷达系统建模(上)

前言 在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;但是 “闪光激光雷达” 解决方案通常都适用于在使用固态光学元件的目标场景中生成可检测的点阵列。凭借具…

教育行业数据可视化应用方案与实践

教育行业背景介绍 随着信息技术发展&#xff0c;教育领域中的学习方式、教学模式、教学内容均已发生重大变革&#xff0c;以云计算、人工智能、物联网、大数据等技术的结合&#xff0c;“智慧教育”的需求也变的紧迫&#xff0c;需要围绕“智慧教育”而产生的产品和解决方案也…

课程思政案例----简道云零代码应用开发实训平台

为了更好推动零代码开发课程的思政建设&#xff0c;在传递大数据相关知识和技能的同时帮助学生塑造正确的世界观、人生观和价值观。我们整理了与简道云平台结合的应用案例&#xff0c;开放给全国各大高校使用。 1、杨卫红&#xff1a;一位55岁不懂代码的农经员&#xff0c;为家…

Windows下将文件夹映射为磁盘

Windows下将文件夹映射为磁盘背景描述方法一&#xff1a;使用命令方法二&#xff1a;映射网络驱动器背景描述 公司发的新电脑&#xff0c;只有普通用户权限&#xff0c;所以可想而知磁盘只有一个C盘&#xff0c;但是以前习惯性的将一些软件啥的放在D盘中&#xff0c;所以把C盘…

打好“三场仗”,数据库新晋厂商石原子胜券在握

纵观数字经济时代&#xff0c;数据规模呈爆发式增长&#xff0c;国产化替代加速发展。据中国信通院《数据库发展研究报告(2021年)》预测&#xff0c;预计到2025年&#xff0c;全球数据库市场规模将达到798亿美元&#xff0c;其中&#xff0c;中国数据库市场总规模将达到688亿元…

js文件模块化引用问题(JavaScript modules)

有个前端项目&#xff0c;需要用到配置文件。这个配置文件实在是太大了&#xff0c;就想拆成多个小的&#xff0c;然后一一引入&#xff0c;组合成一个完整的配置文件。 如果是vue代码&#xff0c;这种情况根本是手到擒来&#xff0c;不费吹灰之力&#xff0c;而该前端项目是个…

(WRF-UCM)高精度城市化气象动力模拟技术

气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过程&#xff0c;而了解现在、未来气候变化则是进行生态、环境及能源评…

vs2022 编译遇见编译器堆空间不足,解决办法(针对CMAKE工程)

1、原因&#xff1a; 就是编译工程文件太大&#xff0c;导致堆栈溢出。原始vs默认的编译器是32位&#xff0c;我们设置为64位就可解决部分问题。 具体可能造成的原因可以参考&#xff1a; 错误 C1060 |微软学习 (microsoft.com) 2、解决&#xff1a; 1、需要提前安装cmake…

iOS关于搜索不规则瀑布流布局的实现小结

最近在项目开发中遇到了不规则搜索布局的问题。 之前常用的解决方案是用一个tableview用一个循环动态的加载&#xff0c;唯一的缺点是需要动态的移除&#xff0c;其实也已经足够。ios搜索历史记录不规则布局-IOS代码类资源-CSDN下载&#xff0c;需要的话可以下载使用。请教了一…

双向链表的实现

这里以结构体的方式来实现链表&#xff0c;也可以使用类。结构体在没有修饰符的情况下&#xff0c;默认是共有访问。如有不对&#xff0c;希望能指出。 目录 一、链表和结点结构体的声明 (ListNode.h) 二、链表各个功能的实现 1、增 (1) 构造函数&#xff08;创建链表头结点…

简历上写着“精通 MySQL”,阿里面试官非要跟我死磕,最后还是给我发了 offer

事情是这样的 前段时间因为想要跳槽就去面试了下阿里&#xff0c;大家也都清楚&#xff0c;精通这个词在简历上属于很难把握住的一个词&#xff0c;如果你在你的简历上面写着你精通 XX 技术&#xff0c;那面试官就会默认你是真的很会&#xff0c;刨根问底问到你崩溃。 我之前…

【踩坑】工作中真实踩坑,一个or让sql变慢7倍

工作中真实踩坑&#xff0c;一个or让sql变慢1000倍1.情况说明2.解释计划3.or改成union4.总结1.情况说明 测试环境&#xff0c;有两张表&#xff0c;分别是讲师表t_train_lecturer(后面简称B表&#xff09;,和讲师的授课时长表t_train_activity&#xff08;后面简称A表&#xf…

opencv 图像平滑

高通滤波可以找到图像的边缘。低通滤波可以去除噪音&#xff0c;模糊图像。 自定义滤波器 cv2.filter2D() import cv2 import numpy as np from matplotlib import pyplot as pltimg cv2.imread(img1.png) imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB) kernel np.ones((5, 5), n…

2022年11月10篇论文推荐

随着最大的人工智能研究会议(NeurIPS 2022)即将到来&#xff0c;我们进入了2022年的最后阶段。让我们回顾一下人工智能世界最近发生了什么。 在介绍推荐论文之前&#xff0c;先说一个很有意思的项目&#xff1a; img-to-music:想象图像听起来是什么样的模型! https://hugging…

人工智能和自动驾驶业务将是百度未来的最强增长动力

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然百度(BIDU)长期以来一直缺乏增长动力&#xff0c;但猛兽财经认为现在可能是投资百度股票的时候了。因为我们认为百度在未来有几个可以实现强劲增长的动力。首先&#xff0c;百度可以利用其在中国自动驾驶市场的领先地位…

如何验证ARP缓存表最多能缓存多少条动态条目

ARP协议原理、ARP缓存表目的,这些在我的文章中已经反复提及过多次了。ARP缓存表里有静态和动态条目两种,静态的是写死的,没有老化时间,不会随着时间的流逝而自动删除。动态条目是缓存的,有老化时间timeout,如果长时间没有刷新,老化时间到了就会自动删除。老化时间是一个…

智能服务机器人产品及解决方案

产品概述 随着人工智能&#xff08;AI&#xff09;领域技术的不断发展和演进&#xff0c;面向人工智能的领域应用也越来越被更多的企业关注。信迈作为中国领先的创新型软件及信息技术服务商&#xff0c;一直致力于人工智能领域技术的探索和实践。 信迈凭借自身雄厚的技术能力…