数字集成电路全流程设计、仿真、综合以和版图等设计,使用centosEDA软件。包括vcs仿真、DC综合、FM形式验证、Astro版图设计、物理验证、PT时序等各
概述
数字集成电路从RTL设计到版图实现是一个复杂的流程,此设计是在以前用verilog编写的单周期CPU的基础上,完成了整个数字集成电路的设计流程,完成了版图,并通过了RTL级仿真、门级仿真和物理验证。
数字集成电路全流程设计是一个复杂的过程,本设计都前端设计较为完整,后端较为粗略
需要工程设计源码以及数字IC EDA,联系 3270516346 企鹅号
一、设计功能概述与RTL仿真
1、设计文件目录
整个设计的文件组织如下:
CPU_make // 存放CPU_make的目录
|----core // 存放原始rtl代码及仿真
|----rtl // 存放rtl源码
|----tb // 存放TestBench文件
|----modelsim // 存放仿真脚本(仿真工具为modelsim)
|----core_ASIC // 存放用于ASIC的源码
|----rtl // 存放rtl源码
|---tb // 存放仿真测试文件
|---modelsim // 存放仿真脚本(仿真工具为modelsim)
|---postdc // 存放门级仿真脚本
|--post_APR_sim //存放ARR后仿真脚本
|----DC //存放综合脚本
|---- run_dc_read_rtl.sh //读入设计脚本
|---- run_dc_constraint_compile.sh //运行设计并添加约束脚本
|--- scripts // 脚本
|----netlist // DC综合生成的门级网表和sdf文件等
|----WORK // DC运行工作目录
|---- reports //生成的各种报告
|---- logs //存放DC运行时产生的输出
|----doc // 存放设计相关文档
|----lib // 存放设计相关库
|----FM_RTL_PostDC //门级网表与RTL级形式验证
|---- run_fm.scr //运行脚本
|----cpu_ASIC.fms //实际运行脚本
|---- logs //存放FM运行时产生的输出
|---Astro //存放版图设计
|--- mw_lib //运行所需库
|---data_fend //设计所需文件目录
|---data_bend //设计生成文件目录
|---logs //运行输出内容
|--- reports //运行输出报告
|---design_lib_cpu_ASIC //Astro最终生成设计
|---FM_PostDC_PostAPR //Astro生成网表与RTL进行形式验证
|---run_fm.scr //运行文件
|---data_bend -> ../Astro/data_bend/
|---data_fend -> ../Astro/data_fend/
|---netlist -> ../DC/netlist/
|--- rtl -> ../core_ASIC/rtl
|---svf -> ../DC/svf/
|---layout //物理验证
|---ANT //天线效应验证
|---LVS //layout vs. schematic
|---DRC //design rule check
|---rule //设计规则文件
|---design_lib_cpu_ASIC //设计版图
|---logo
|---mytools
|---SMIC18STDLIBM6
|---PT //时序分析
|---reports //生成报告
|---logs //运行产生文件
|---data_bend -> ../Astro/data_bend/
2、RTL代码概述
1、使用自己用verilog HDL编写的32位MIPS单周期CPU,实现了常用的各种指令,代码结构如下:
cpu_ASIC.v 添加PADded顶层文件
cpu_top.v 顶层文件,连接各模块
CU.v 控制单元
IM.v 指令寄存器
PC.v 程序计数器
NPC.v 下一地址生成单元
RF.v 寄存器
EXT.v 位扩展模块
DM.v 数据存储器
2、为端口添加PAD单元:
PLBI8F U_clk (.D( clk ), .P( PAD_clk ), .A( 1'b0 ), .CONOF( 1'b1 ), .NEN( 1'b0 ), .PD( 1'b0 ), .PEN( 1'b0 ), .PU( 1'b1 ), .SONOF( 1'b0 )); //in
PLBI8F U_reset (.D( reset ), .P( PAD_reset ), .A( 1'b0 ), .CONOF( 1'b1 ), .NEN( 1'b0 ), .PD( 1'b0 ), .PEN( 1'b0 ), .PU( 1'b1 ), .SONOF( 1'b0 )); //in
PLBI8F U_y0_0 (.D( ), .P( PAD_y0[ 0] ), .A( y0[ 0] ), .CONOF( 1'b0 ), .NEN( 1'b1 ), .PD( 1'b0 ), .PEN( 1'b1 ), .PU( 1'b1 ), .SONOF( 1'b0 )); //out
PLBI8F U_y0_1 (.D( ), .P( PAD_y0[ 1] ), .A( y0[ 1] ), .CONOF( 1'b0 ), .NEN( 1'b1 ), .PD( 1'b0 ), .PEN( 1'b1 ), .PU( 1'b1 ), .SONOF( 1'b0 )); //out
3、为测试系统功能,软件编写一个求平均数的二进制程序进行测试,并将用到的相关的寄存器的值引到输出,通过观察相关寄存器的值来判断试题功能是否正确。
3、RTL仿真
RTL仿真
使用modelsim进行RTL级仿真,verdi查看波形图。
Verdi波形
通过波形可以看出,PAD_y5为最终输出的平均数的值,PAD_y为计数值,RTL仿真通过。
二、DC综合与门级仿真、FM形式验证
1、DC综合概述
1、综合就是把行为级的RTL代码在工艺、面积、时序等约束下转换成对应的门级网表。综合是使用软件的方法来设计硬件,然后将门级电路实现与优化的工作留给综合工具的一种设计方法。DC综合分为三阶段:转换、优化、映射,即Synthesis=translation optimization mapping。
2、DC综合的流程
.synopsys_dc.setup文件设置
1、.synopsys_dc.setup为DC启动时读入的文件,预置DC运行环境,一般放置设置库的语句。
2、在.synopsys中设置库文件路径,生成报告、工作路径以及顶层模块路径
3、在设计中工艺库采用SMIC18,具体配置为:
# Define working directory
set TOPDIR [sh pwd]
# Define RTL source files directory
set topDir "../core_ASIC/rtl"
# Output files directory
set reportsDir "$TOPDIR/reports"
set netlistDir "$TOPDIR/netlist"
set svfDir "$TOPDIR/svf"
# Design Compile system setting
set search_path ". $topDir"
lappend search_path "../lib/SMIC18_Ver2.5/FEView_STDIO/IO/Synopsys/"
lappend search_path "../lib/SMIC18_Ver2.5/FEView_STDIO/IO/Verilog/"
lappend search_path "../lib/SMIC18_Ver2.5/FEView_STDIO/STD/Synopsys/"
lappend search_path "../lib/SMIC18_Ver2.5/FEView_STDIO/STD/Verilog/"
# Cell library
set target_library "smic18_ss.db"
# Pad library
lappend target_library "smic18IO_line_ss.db"
set synthetic_library "dw_foundation.sldb"
set link_library "* $target_library $synthetic_library"
# symbol library
set symbol_library "smic18IO.sdb"
lappend symbol_library "smic18.sdb"
# specify directory for intermediate files from analyze
define_design_lib DEFAULT -path ./analyzed
set cache_write ./
set cache_read $cache_write
# specify varibles
set sh_enable_line_editing true
set hdlin_ff_always_sync_set_reset "FALSE"
set write_name_nets_same_as_ports true
set high_fanout_net_threshold 60
set high_fanout_net_pin_capacitance 0.01
3、读入设计
将设计源文件读入并链接,将读入的设计存储为“.ddc”文件,方便在此调用,不用重复读入设计源文件。具体脚本大体为:
#从linux系统中获得“exit_switch”变量的值
set exit_switch [getenv exit_switch]
#设置顶层模块
set TOP_MODULE cpu_ASIC
#生成svf文件,用于指导FM验证
set_svf ${svfDir}/${TOP_MODULE}.svf
#指定设计WORK文件位置
define_design_lib WORK -path WORK
#分析设计源文件
analyze -format verilog -lib WORK [sh ls $topDir/*.v]
elaborate $TOP_MODULE
#确定当前设计并进行链接
current_design $TOP_MODULE
link
if { [link] == 0 } {
echo "Linking Error when deal with $TOP_MODULE"
exit;
}
uniquify
#检查设计中是否存在问题,检查不通过则退出
if { [check_design] == 0 } {
echo "Check Design Error when deal with $TOP_MODULE"
exit;
}
#保存设计
write -format ddc -hierarchy -output ${netlistDir}/${TOP_MODULE}_unmapped.ddc
# Finish and Quit
if {$exit_switch == "true"} {
exit
}
4、设置约束
1、为设计添加约束可以指导DC如何进行综合和优化,主要为时序约束、芯片工作环境约束、区域和位置约束、芯片引脚特性面积和功耗约束等,其中最重要的为时序约束。
2、为设计添加时序约束,指定时钟周期为“50”,指定面积、功耗、端口等的约束,具体约束为(详见文件DC/scripts/constraint.tcl):
#指定当前设计
current_design $TOP_MODULE
#移除任何已经存在的约束
remove_sdc
#****************************************************
#MAX freq : 20M 设置时钟频率
set SYS_CLK_PERIOD 50.0
#****************************************************
#指定复位与时钟引脚
set Rst_list [list PAD_reset]
set Clk_list [list PAD_clk]
#****************************************************
# Define The Design Enviroment
#****************************************************
set_min_library smic18_ss.db -min_version smic18_ff.db
set_min_library smic18IO_line_ss.db -min_version smic18IO_line_ff.db
set_operating_conditions -analysis_type bc_wc -min best -max worst
#用来为DC提供估计的线载信息,反过来DC使用线载信息把连线延迟建模为负载的函数。
set_wire_load_mode "segmented"
set_wire_load_model -name reference_area_20000 -library smic18_ss
#****************************************************
# clock defination and reset
#****************************************************
#MAX freq : 2M
#physical clock and reset
#建立时钟,指定时钟引脚,时钟周期,波形
create_clock -name clk -period $SYS_CLK_PERIOD -waveform [list 0 [expr $SYS_CLK_PERIOD /2]] [get_ports PAD_clk]
#设置“dont_touch_network”属性就是在优化的时候,不会对原有的器件进行替换
#设置“set_ideal_network”,相应模块就会0转换时间,0延时,综合优化的时候不会对路径的cell和net进行优化。
#clk
set_dont_touch_network [all_clocks]
set_ideal_network [get_pins "U_clk/D"]
#reset
set_dont_touch_network [get_ports "$Rst_list"]
set_ideal_network [get_ports "$Rst_list"]
#****************************************************
# clock constraints
#****************************************************
#实际时钟源到"create_clock"引脚的延时最大为0.8
set_clock_latency -source -max 0.8 [all_clocks]
#时钟从“create_clock”的引脚到寄存器引脚的延时最大为0.8
set_clock_latency -max 0.8 [all_clocks]
#设置时钟不确定时间为0.3,时钟树不同网络之间的最大延时
set_clock_uncertainty 0.3 [all_clocks]
#寄存器的时钟在上升沿和下降沿的最大转换时间为0.5
set_clock_transition 0.2 [all_clocks]
#生成时钟相关报告
report_clocks -nosplit > ${reportsDir}/${TOP_MODULE}.clocks.txt
#****************************************************
# drive and load, max_fanout,max_capacitance
#****************************************************
set MAX_LOAD [load_of smic18_ss/NAND2HD2X/A]
#set_drive命令用于指定输入端口的驱动强度,主要用于模块建模或芯片端口外驱动电阻。
#0值表示最高驱动强度且通常用于时钟端口。
set_drive 0 [get_ports "$Rst_list"]
set_drive 0 [get_ports "$Clk_list"]
#设置输入端口的驱动单元
set_driving_cell -lib_cell PLBI8S [remove_from_collection [all_inputs] \
[get_ports [list PAD_clk PAD_reset]]]
set_max_capacitance [expr $MAX_LOAD*12] [get_designs *]
#设置输出的最大电容负载
set_load -max [expr $MAX_LOAD*15] [all_outputs]
set_max_fanout 10 [all_inputs]
set_max_transition 1.0 $TOP_MODULE
#获得所有的输入输出引脚除clk和rst之外,为多个引脚设置约束
set in_ports [remove_from_collection [all_inputs] [get_ports [list PAD_clk PAD_reset]]]
set out_ports [get_ports [list PAD_y0 PAD_y3 PAD_y4 PAD_y5 PAD_y]]
#no input remove clk\reset
#设置数据到达输入引脚的最大和最短时间
#min:50-0.2(transition)-0.3(uncertainty )
set_input_delay -max 5 -clock clk $in_ports
set_input_delay -min 0.5 -clock clk $in_ports
#设置数据输出的最大和最小延时时间
set_output_delay -max 5 -clock clk $out_ports
set_output_delay -min -1 -clock clk $out_ports
#****************************************************
# false path,就是我们在进行综合分析时,不希望综合工具进行分析的那些路径。
#****************************************************
set_false_path -from [get_ports "$Rst_list"]
#****************************************************
# case_analysis
#****************************************************
#case_analysis 给某个Pin指定固定电平,然后时序分析会根据该结果优化原先的电路。
set_case_analysis 0 [get_pins "U_reset/D"]
# area and power设置面积和功耗
set_max_area 20000
set_max_total_power 0 uw
#****************************************************
# don't touch
#****************************************************
#优化时不替换原有器件
set_dont_touch [get_cells U_* ]
5、产生输出netlist网表和各种报告文件
1、输出相关文件:
#检查设计和时序
check_design > ${reportsDir}/${TOP_MODULE}.check_design.txt
check_timing > ${reportsDir}/${TOP_MODULE}.check_timing.txt
#****************************************************
# Output Reports
#****************************************************
report_design -nosplit > ${reportsDir}/${TOP_MODULE}.design.txt
report_port -nosplit > ${reportsDir}/${TOP_MODULE}.port.txt
report_net -nosplit > ${reportsDir}/${TOP_MODULE}.net.txt
report_timing_requirements -nosplit > ${reportsDir}/${TOP_MODULE}.timing_requirements.txt
report_constraint -nosplit -all_violators > ${reportsDir}/${TOP_MODULE}.constraint.txt
report_timing -nosplit > ${reportsDir}/${TOP_MODULE}.timing.txt
report_area -nosplit > ${reportsDir}/${TOP_MODULE}.area.txt
report_power -nosplit > ${reportsDir}/${TOP_MODULE}.power.txt
#****************************************************
# Output Results
#****************************************************
#输出门级网表
write -format verilog -hierarchy -output ${netlistDir}/${TOP_MODULE}.vg
#保存设计
write -format ddc -hierarchy -output ${netlistDir}/${TOP_MODULE}.ddc
#得到标准延时格式文件,用于后端布局布线
write_sdf ${netlistDir}/${TOP_MODULE}_post_dc.sdf
#得到“.sdc”约束文件
write_sdc -nosplit ${netlistDir}/${TOP_MODULE}.sdc
2、输出的门级网表,“.ddc”设计文件,约束文件等:
3、输出的时序、功耗等报告:
4、 查看时序分析报告,分析是否有时序违规
数据到达时间为207.34,数据应该到达时间为499.94,slack时间为292.60,满足时序条件
6、postDC后仿真
1、对DC生成的门级网表进行仿真,仿真的文件主要为DC生成门级网表、标准单元库、IO单元库,具体为(vlog.args):
libext .v
-vlog01compat
acc
define DUMP_FSDB
define POST_DC
-y /../rtl
-work work
../../DC/netlist/cpu_ASIC.vg
//PAD
../../lib/SMIC18_Ver2.5/FEView_STDIO/IO/Verilog/smic18IO_line.v
//Stdcell
../../lib/SMIC18_Ver2.5/FEView_STDIO/STD/Verilog/smic18.v
// Testbench files
incdir ../../bench
../tb/tb.v
2、verdi观察到的波形为:
与RTL仿真的波形一致,门级仿真通过。
7、FM形式验证
1、形式验证是采用数学证明等方法,验证设计的属性等效性等,不需要电路动作,降低验证时间,形式验证的大体流程为:
2、FM在启动时会自动加载“.synopsys_fm.setup”,我们在这个文件中加载与工艺库相关的文件等:
# 设置工作目录
set TOPDIR [sh pwd]
# 设置源文件目录
set topDir "$TOPDIR/rtl"
# 设置输出文件目录
set reportsDir "$TOPDIR/reports"
set netlistDir "$TOPDIR/netlist"
set svfDir "$TOPDIR/svf"
#设置dw库目录
set hdlin_dwroot /opt/synopsys/syn/P-2019.03-SP3/
#设置搜寻目录
set search_path
". ./lib/SMIC18_Ver2.5/FEView_STDIO/STD/Synopsys/ ./lib/SMIC18_Ver2.5/FEView_STDIO/IO/Synopsys/ ./netlist ./rtl ./lib/SMIC18_Ver2.5/FEView_STDIO/STD/Verilog/ ./lib/SMIC18_Ver2.5/FEView_STDIO/IO/Verilog/"
3、进行形式验证:
设置顶层文件
set TOP_MODULE cpu_ASIC
#设置搜索目录
set search_path "$search_path $topDir "
#让FM自动加载svf文件,指导FM
set synopsys_auto_setup true
set_svf ${svfDir}/${TOP_MODULE}.svf
#加载库文件
read_db "lib/SMIC18_Ver2.5/FEView_STDIO/STD/Synopsys/smic18_tt.db lib/SMIC18_Ver2.5/FEView_STDIO/IO/Synopsys/smic18IO_line_tt.db"
#读入参考设计并设置顶层文件
read_verilog -r [sh ls $topDir/*.v]
set_top ${TOP_MODULE}
#读入实现设计并设置顶层文件
read_verilog -i ${TOP_MODULE}.vg
set_top ${TOP_MODULE}
#进行对比
Match
#进行验证,如何验证失败进入调试
if [ verify ] {
date
exit
} else {
diagnose
report_unmatched
report_failing
report_error_candidates
}
4、形式验证结果:
由此可见,形式验证通过。
三、版图设计
1、设计输入
1、将门级网表、设计约束、工艺库等导入到Astro目录下并对约束进行处理使Astro可以读入。
工艺库只用到了标准单元库与IO库:
2、建立设计,并把设计命名为“design_lib_cpu_ASIC”,使用图形化界面处理完之后,保存为脚本,以后直接加载脚本即可建立设计:
加载设计:
载入设计的脚本的主要操作(/1.0_design_setup.cmd):
建立设计之后并将此时的设计单元保存为“1.0_design_setup2、UART配置
2、布局规划(floorplan)
1、布局规划在整个流程中处于十分重要的地位,Floorplan一旦确定,整个芯片的面积、宏单元的位置等也就确定,Floorplan的质量也与设计的timing和布通率有着密切的关系,这一步决定着设计的好坏,需要反复调整。
2、DC报告的功耗值:
内核的功耗比较低,大约为1mW,内核的供电PAD一对就够了。
输出PAD有136个,136*8/51=21,所以给IO的电源PAD为21对,我们一个设置22对电源PAD,分别放置在芯片的四周。
编写tdf文件,规划电源PAD与引脚的排放位置,总引脚的个数为电源PAD24 137芯片引脚为161个,上下左右分别安排41、40、40、40个引脚,由于引脚所确定的面积大约core的面积,芯片面积有引脚的面积确定。其中左端引脚排列为:
3、设置内核大小(宽度和高度)为( 40(边PAD数)74(PAD宽度) 1842 ) - 802 - 1842=2800。然后在PAD中间填充PAD filler形成Pad rings环,再将电源PAD与core ring连接起来。
设置core大小:
连接电源环:
放置完PAD和电源环之后的版图为:
4、在适当的位置添加电源条,方便个cell电压均匀,添加了电源条的版图为:
5、进行stdcell摆放区域的规划,在某些电源PAD接入的地方,Metal 1很难接入,在此区域不放置cell。最后保存规划好版图的设计。
3、时序约束与布局
1、进行时序约束,导入sdc文件,检查sdc对设计的约束是否完备有效。
2、时序检查是分阶段进行的,布局前的、布局后的、时钟树综合前的、时钟树综合后的。越早阶段时,情况越理想,若早阶段时不能满足时序要求,说明可能存在时序不满足的可能;若不满足时序要求,但相差在5~10%之内,还是有较大的可能在后续步骤中修正的。
3、进行自动布局,首先设置工作环境和工作模式和各种优化选项,然后进行自动布局。
(空白区域是由于让在某些电源PAD接入的地方不放置stdcell)
4、时钟树综合、post-CTS优化
1、先报告时钟树情况,然后设定时钟树综合约束,最大扇出等信息。
2、设定优化选线,进行时钟树综合,在做post-DC阶段的place
3、在做post-place阶段的时钟树优化,检查时序,最后报告时序。Post-place的时序报告其中部分为:
4、布线
1、先布时钟信号线,指定只布时钟信号:
2、布时钟信号后设置时序、优化选项等,布标准单元
3、布线后进行检查和修复,设定检查次数为20次
4、在布线后进行优化时钟树
5、完成布线后的版图为:
5、DFM
1、检查和修复天线效应。加载ANT文件:
设定优化选项,并设定检查修复次数为20次:
2、添加core filler并重新连接一次PG环。
3、进行过孔优化:
4、添加label和wire track
5、做完DFM的版图为:
6、导出数据
导出网表用于后仿真、LVS等,导出GDSII用于流片,SPEF文件用于PT时序分析,SDF文件用于后仿真。
四、版图后仿真以及形式验证
1、后仿真
1、对Astro生成的网表进行仿真,即对cpu_ASIC.lvs.vg、smic18IO_line.v、smic18.v进行仿真。
2、在tb中加入sdf时序相关文件:
3、仿真之后查看波形:
波形与RTL级仿真,DC门级网表仿真基本一致,后仿真通过。
2、FM形式验证
1、我们进行DC生成的网表与Astro生成的网表进行验证,验证方式与RTL和DC形式验证相似。仿真脚本为:
#设置顶层文件
set TOP_MODULE cpu_ASIC
#设置搜索目录
set search_path "$search_path "
set synopsys_auto_setup true
#读入库文件
read_db "lib/SMIC18_Ver2.5/FEView_STDIO/STD/Synopsys/smic18_tt.db lib/SMIC18_Ver2.5/FEView_STDIO/IO/Synopsys/smic18IO_line_tt.db"
#读入参考设计并设置顶层文件
read_verilog -r "${postDCDir}/${TOP_MODULE}.vg"
set_top ${TOP_MODULE}
#读入实现的设计并设置顶层文件
read_verilog -i "${postAPRDir}/${TOP_MODULE}.lvs.vg"
set_top ${TOP_MODULE}
#进行验证
match
if [ verify ] {
date
exit
} else {
diagnose
report_unmatched
report_failing
report_error_candidates
}
2、形式验证的结果如下,可见设计通过了验证
五、物理验证
1、环境资源准备
1、拷贝“SmicVTTF_LO_SRAM_MR_MM_HV_LC_018.tf” display.drf 到layout目录
2、新建cds.lib文件,内容为:
INCLUDE $CDSHOME/share/cdssetup/cds.lib //包含原有cds.lib内容
DEFINE SMIC18IOLIB_L_M6 SMIC18IOLIB_L_M6//加入IO库和标准单元库
DEFINE SMIC18STDLIBM6 SMIC18STDLIBM6
DEFINE mytools mytools //加入自己的库
DEFINE logo logo //加入自己的logo
DEFINE avTech /opt/cadence/assura/tools/assura/etc/avtech/avTech
DEFINE design_lib_cpu_ASIC design_lib_cpu_ASIC //加载自己的设计
DEFINE design_lib_cpu_ASIC /home/class/user29/CPU_make/Astro/design_lib_cpu_ASIC
3、配置快捷键、Calibre等
4、标准库、IO库导入ic5141
5、将设计导入ic5141(stream_in_cpu_ASIC要在原有模板上修改)
6、打开设计库
2、LVS检查
1、为电源PAD添加label:
2、生成spi文件
3、运行LVS,由下图结果可知,LVS通过。
3、ANT检查
通过Calibre进行检查,由下图可知ANT检查通过,没有ANT错误出现
4、DRC检查
运行DRC进行检查
由分析结果可知,DRC大部分通过,只出现了较少个数的DRC问题,需要进行人工修正
六、PT时序分析
1、PT简要概述
PT是一个专门用来进行时序分析的工具,使用的步骤常为:
1、read 2、Constraints 3、Exceptions
4、Check 5、Analyze
2、添加约束,运行PT
PT的约束与DC中的时序约束非常相似,PT中只增加了来自Astro产生的“cpu_ASIC.spef”约束相关文件:
3、查看结果
PT运行产生相关报告的文件:
时序报告中slack时间为正,满足时序要求,不存在时序违规
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiaccih
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22