数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)
注: 资料都是基于网上一些博客分享和自己学习整理而成的
Verilog
1. 数据类型
Verilog一共有19种数据类型
基础四种数据类型:reg型,wire型,integer型,parameter型
- reg型
reg类型是寄存器数据类型的关键字。寄存器是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用相当于改变触发器存储器的值。reg类型常用在always模块中指定信号,代表触发器。在always块内被赋值的每一个信号都必须定义为reg型,即赋值操作符的右端变量必须是reg型。通常在设计中要由always模块通过使用行为描述语句来表达逻辑关系。
reg 型信号的定义格式如下:
reg [n-1:0] 数据名 1,数据名2,……数据名N; 共定义了N个寄存器变量,每个寄存器的位宽为n。 - wire型
wire类型是可以看成是单向的物理连线,通过wire连接输入输出的情况。Verilog程序模块中输入、输出信号类型默认为wire型。wire型信号可以用做方程式的输入,也可以用做“assign”语句或者实例元件的输出。
wire 型信号的定义格式如下:
wire [n-1:0] 数据名 1,数据名2,……数据名N; 共定义了N条线,每条线的位宽为n。 - integer型
integer也是一种寄存器数据类型,integer 类型的变量为有符号数,而 reg 类型的变量则为无符号数,除非特别声明为有符号数。 integer 的位宽为宿主机的字的位数,但最小为32位,用integer的变量都可以用
reg 定义。 - parameter型
parameter 定义常量,即用parameter来定义一个标志符表示一个常数。采用该类型可以提高程序的可读性和可维护性。
parameter 型信号的定义格式如下:
parameter 参数名 1 = 数据;
其他数据类型: large 型、medium 型、small 型、scalared 型、time 型、tri 型、trio 型、tril 型、triand 型、trior 型、trireg 型、vectored 型、wand 型和 wor 型。
2. 常用关键字
关键字 | 含义 |
---|---|
module | 模块开始定义 |
input | 输入端口定义 |
output | 输出端口定义 |
inout | 双向端口定义 |
parameter | 信号的参数定义 |
wire | wire信号定义 |
reg | reg信号定义 |
always | 产生reg信号语句的关键字 |
assign | 产生wire信号语句的关键字 |
begin | 语句的起始标志 |
end | 语句的结束标志 |
posedge/negedge | 时序电路的标志 |
case | Case语句起始标记 |
default | Case语句的默认分支标志 |
endcase | Case语句结束标记 |
if | if/else语句标记 |
else | if/else语句标记 |
for | for语句标记 |
endmodule | 模块结束定义 |
3. 运算符
类型 | 运算符 |
---|---|
算术运算符 | +,-,×,/,% |
赋值运算符 | =,<= |
关系运算符 | >,<,<=,>= |
逻辑运算符 | &&,||,! |
条件运算符 | (?:)三目运算符 |
位运算符 | |,^,&,^~ |
移位运算符 | >>,<< |
拼接运算符 | { } |
![]() |
特别的 缩减运算:是对单个操作数进行或与非递推运算,最后的运算结果是一位的二进制数。 位运算则是对操作数的相应位进行与或非运算,操作数是几位数则运算结果也是几位数。
缩减运算的具体运算过程是这样的:
- 第一步先将操作数的第一位与第二位进行或与非运算,
- 第二步将运算结果与第三位进行或与非运算,
- 依次类推,直至最后一位。
4. if-else
设计要点
- 条件语句必须在过程块中使用。所谓过程块语句是指由initial、always引导的执行语句
集合。除了这两个语句块引导的begin end块中可以编写条件语句外,模块中的其他地
方都不能编写。 - if 语句中的表达式一般为逻辑表达式或者关系表达式。系统对表达式的值进行判断;
若为0,z,X;按照假处理;若为1按照真处理,执行指定的语句; - if(a)等价于 if(a == 1);
- if语句可以·嵌套·使用
- end总是与离它最近的一份else配对。
注:如果if语句使用不当,没有else, 可能会综合出来意想不到的锁存器。在always 块里面,如果在给定的条件下变量没有被赋值,这个变量将会保持原来的值,也就是说会生成一个锁存器。
5. case
case 语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。 它通常用于实现一个多路复用器。 如果要检查的条件很多,if-else结构可能不合适,因为它会综合成一个优先编码器而不是多路复用器。
特别的: casez与casex语句是case语句的两种变体, 在写testbench时用到。综合工具并不会认识x,z这个状态,所以综合出来的电路是一样case类型的。
- 在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。
- 在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。
- 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。
Verilog case 语句以 case 关键字开始,以 endcase 关键字结束。在括弧内的表达式将被精确地评估一次,并按其编写顺序与备选方案列表进行比较,与给定表达式匹配的备选方案的语句将被执行。一块多条语句必须分组,并在 begin 和 end 范围内。
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default
endcase
: <statement>
如果所有的 case 项都不符合给定的表达式,则执行缺省项内的语句,缺省语句是可选的,在case 语句中只能有一条缺省语句。case语句可以嵌套。 如果没有符合表达式的项目,也没有给出缺省语句,执行将不做任何事情就退出case块。 同 if else,case 应当加上default,以避免锁存器出现,如果case的情况是完备的,可以不加。
6. for 循环 && generate 语句
在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别。 for 循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源。 简单的说就是:for 语句循环几次,就是将相同的电路复制几次,因此循环次数越多,占用面积越大,综合就越慢。配合 generate可以用for语句进行相同模块的多次例化
Verilog 中的 generate 语句常用于编写可配置的、可综合的RTL的设计结构。它可用于创建
模块的多个实例化,或者有条件的实例化代码块。
module top(input [8*4-1 : 0] din0, input [8*4-1 : 0] din1,output logic [8*4-1 : 0] dout0,output logic [8*4-1 : 0] dout1
);genvar i; //genvar 循环变量名,只能用在generate(多例化语句)中//例化出来的模块名编译器自动用begin后面的名字来区分,比如上面这个例子编译后模块名叫inst[0]、inst[1]......generate for(i=0; i<4; i++) begin:instsub u_sub_0 (//output.dout(dout0[i*8 +: 8]),//input.din(din0[i*8 +: 8]));sub u_sub_1 (//output.dout(dout1[i*8 +: 8]),//input.din(din1[i*8 +: 8]));endendgenerate
endmodule
7. function 函数 && tesk 任务
这两个东西经常放在一起判别
function
function <返回值的类型或范围> <函数名>
<端口说明语句>
<变量类型说明>
begin
<语句>
…
end
endfunction
// 示例
function [7:0] getbyte ; //默认 getbyte为同名返回寄存器input [15:0] address ; //这个也可以放在声明处begin <说明语句> //从地址字节提取低字节的程序 getbyte = result_expression ; //把结果赋给函数的返回字节 end
endfunction
说明
① <返回值的类型或范围>这一项为可选项,如果缺失,则返回值为一位寄存器类型数据。
② 从函数的返回值:函数的定义蕴含声明了与函数同名、位宽一致的内部寄存器。例子中,
getbyte被赋予的值就是调用函数的返回值。
③ 函数的调用:函数的调用是通过将函数作为表达式中的操作数来实现的。其调用格式:
<函数名> (<表达式> ,…, <表达式>); 其中函数名作为确认符。下面的例子中,两次调用getbyte,把两次调用的结果进行位拼接运算,以生成一个字。
word = control ? {getbyte(msbyte),getbyte(lsbyte)} : 8’d0 ;
④ 函数使用的规则
1 函数定义不能包含有任何的时间控制语句,即任何用#、@、wait来标识的语句。
2 函数不能调用“task”。
3 定义函数时至少要有一个输入参数。
4 在函数的定义中必须有一条赋值语句给函数中与函数名同名、位宽相同的内部寄存器赋值。
5 verilog中的function只能用于组合逻辑;
tesk
任务就是一段封装在“task-endtask”之间的程序。任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的。 调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端。另外,任务可以彼此调用,而且任务内还可以调用函数。
任务定义的形式如下:
task task_id; // task 标志着一个 任务定义结构的开始;task_id 是任务名;[declaration] //可选项 declaration 是端口声明语句和变量声明语句,任务接收输入值和返回输出值就是通过此处声明的端口进行的;procedural_statement //procedural_statement 是一段用来完成这个任务操作的过程语句,如果过程语句多于一条,应将其放在语句块内;
endtask //endtask 为任务定义结构体结束标志。下面给出一个任务定义的实例。
task task_demo; //任务定义结构开头,命名为 task_demo input [7:0] x,y; //输入端口说明 output [7:0] tmp; //输出端口说明 if(x>y) //给出任务定义的描述语句 tmp = x; else tmp = y;
endtask
注:任务中不能出现 initial 语句和 always 语句语句,但任务调用语句可以在 initial 语句 和 always 语句中使用
其语法形式如下:task_id[(端口 1, 端口 2, …, 端口 N)]; 其中 task_id 是要调用的任务名,端口 1、端口 2,…是参数列表。
参数列表给出传入任 务的数据(进入任务的输入端)和接收返回结果的变量(从任务的输出端接收返回结果)。**任务调用语句中,参数列表的顺序必须与任务定义中的端口声明顺序相同。**任务调用语句是过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型。
例:通过 Verilog HDL 的任务调用实现一个 4 比特全加器。
module EXAMPLE (A, B, CIN, S, COUT); input [3:0] A, B; input CIN; output [3:0] S; output COUT; reg [3:0] S; reg COUT; reg [1:0] S0, S1, S2, S3; task ADD; input A, B, CIN; output [1:0] C; reg [1:0] C; reg S, COUT; begin S = A ^ B ^ CIN; COUT = (A&B) | (A&CIN) | (B&CIN); C = {COUT, S}; end endtaskalways @(A or B or CIN) begin ADD (A[0], B[0], CIN, S0); ADD (A[1], B[1], S0[1], S1); ADD (A[2], B[2], S1[1], S2); ADD (A[3], B[3], S2[1], S3); S = {S3[0], S2[0], S1[0], S0[0]}; COUT = S3[1]; end
endmodule
8. 过程块 initial && always
过程块是行为模型的基础,过程块有两种: initial 块,只能执行一次;always 块,循环执行
initial 块
initial块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。用initial语句来生成激励波形作为电路的测试仿真信号。一个模块中可以有多个initial块,它们都是并行运行的。
always 块
边沿触发的always 块常常描述时序逻辑,如果符合可综合风格要求可用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑,而电平触发的always 块常常用来描述组合逻辑和带锁存器的组合逻辑,如果符合可综合风格要求可转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。一个模块中可以有多个always块,它们都是并行运行的。
9. Verilog中的可综合和不可综合语句
Verilog是描述硬件电路的,一个语言描述的程序映射成实际硬件电路中的结构时时可实现即为可综合语句。
task和function都是可综合的,不过综合出来的都是组合逻辑电路。要想可综合,task和function内部必须是组合逻辑。 循环语句(repeat、while、for)也可以用于可综合电路设计,当采用循环语句进行计算和赋值操作时,可以综合得到逻辑电路。
Verilog中可综合语句: input、output、parameter、reg、wire、always、assign、begin…end、case、posedge、negedge、or、and、default、if、function、generate、integer、`define,while、repeat 、for (while、repeat循环可综合时,要具有明确的循环表达式和循环条件,for可综合时也要有具体的循环范围)
不可综合语句: initial、fork… join、wait、time、real、display、forever。
要保证Verilog HDL 赋值语句的可综合性,应注意以下要点:
(1)不使用initial。
(2)不使用#10。 以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。 如:a=#10 b; 这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;
(3)不使用循环次数不确定的循环语句,如forever、while等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
(10)不能在一个以上的always 过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
(12)避免混合使用上升沿和下降沿触发的触发器。
(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
(14)避免在case语句的分支项中使用x值或z值。
10. 阻塞/非阻塞
阻塞赋值
阻塞赋值使用的赋值运算符为“=”。阻塞赋值的过程是立刻执行的,即阻塞赋值运算符右侧表达式求值完后立刻会更新至运算符左侧,并且这个执行的过程不受其他语句执行的影响,其后的语句只有当前的赋值操作执行完成后才能顺序执行。
非阻塞赋值
非阻塞赋值使用的赋值运算符为“<=”。非阻塞赋值执行过程为:在当前仿真时间槽(timeslot)开始分析计算获得右侧表达式的值,在当前时间槽执行结束时更新左侧表达式的值,在右侧表达式分析计算和左侧表达式被更新之间,任何其他事件都可以执行,同时也有可能修改已经计算完成的右侧表达式的值,即非阻塞赋值的过程不影响其他语句的执行。
11. Verilog 模块编程的8个原则:
- 时序电路建模时,用非阻塞赋值。
- 锁存器电路建模时,用非阻塞赋值。
- 用always块建立组合逻辑模型时,用阻塞赋值。
- 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
- 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
- 不要在一个以上的always块中为同一个变量赋值。
- 用$strobe 系统任务来显示用非阻塞赋值的变量值。
- 在赋值时不要使用#0延时。
12. 时间尺度 timescale
timescale 是 Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真时的时间
单位和时间精度。格式如下:
` timescale<时间单位>/<时间精度>
注:
- 用于说明仿真时间单位和时间精度的数字只能是1、10、100,不能为其它的数字。
而且,时间精度不能比时间单位还要大,最多两则一样大。`timescale 100ns/100ns - 在编译过程中,timescale 指令影响这一编译器指令后面所有模块中的时延值,直至遇到另一个timescale 指令resetall 指令。 在verilog 中是没有默认timescale的,一个没有指定timescale的verilog模块就有可能错误的继承了前面编译模块的无效timescale参数。
13. 存储器设计
Verilog 中提供了两维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存定义为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如
数组(内存)定义
reg [wordsize : 0] array_name [0 : arraysize];
例如:
reg [7:0] my_memory[0:255];
其中 [7:0] 是内存的宽度(位宽),而 [0:255] 则是 内存的深度(也就是有多少存储单元),其中宽度为8位,深度为256。地址0对应着数组中的0存储单元。
写操作: 如果要存储一个值到某个单元中去,可以这样做: my_memory[address] = data_in;
读操作: 而如果要从某个单元读出值,可以这么做: data_out = my_memory[address];
14. 三态门设计
三态指其输出既可以是一般二值逻辑电路,即正常的高电平(逻辑 1)或低电平(逻辑 0),又可以保持特有的高阻抗状态,高阻态相当于隔断状态(电阻很大,相当于开路)。
//下面是三态门的 Verilog 代码实现:
module Tri(
input din,
input en,
output reg dout );
always @(din or en) if (en) dout <= din; else dout <= 1'bz;
// 数据流描述 assign dout = en ? din : 1'bz;
endmodule
15. 原语
原语,即primitive。不同的厂商,原语不同;同一家的FPGA,不同型号的芯片,可以也不一样;原语类似最底层的描述方法。 使用原语的好处,可以直接例化使用,不用定制IP;即可通过复制原语的语句,然后例化IP,就可使用。
常见原语:
- IBUF 和 IBUFDS(IO)
IBUF 是输入缓存,一般vivado会自动给输入信号加上,IBUFDS是IBUF的差分形式,支持低压差分信号(如LVCMOS、LVDS等 )。 在 IBUFDS中,一个电平接口用两个独特的电平接口(I和IB)表示。一个可以认为是主信号,另一个可以认为是从信号。主信号和从信号是同一个逻辑信号,但是相位相反。 - IDDR(Input/Output FuncTIons)
设计用来接收DDR数据,避免额外的时序复杂性。 - IBUFG 和 IBUFGDS(IO)
IBUFG 即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。 IBUFGDS是IBUFG的差分形式支持低压差分信号(如LVCMOS、LVDS等 )
System Verilog (还不熟悉暂时写这些)
1. 数据类型
四值变量:(0、1、x、z)四种状态
四值逻辑类型:integer、reg、logic、reg、net-type(如wire、tri);
SV 并不太常用变量类型是wire(assign语句中),还有reg(initial和always语句中)。
logic 用的比较多, 可以被连续赋值语句驱动,可用在assign、initial、always语句中。在SystemVerilog 中,可以在过去verilog 中用 reg 型或是wire型的地方用logic 型来代替。
二值变量:(0、1) 两种状态
二值逻辑类型:byte、shortint、int、longint、bit。
四值变量与二值变量的特性:
四值变量的默认初始值为x,二值变量的默认初始值为0,在initial中可以直接使用~clk变成1,但是如果是logic,必须设置初值为0、或者1。将四值变量赋值给二值变量,x和z状态会转变为0;
符号数分类
有符号类型:byte、shortint、int、longint、integer。
无符号类型:bit、logic、reg、net-type(如wire、tri)。
对于转换方式,可以分为隐式转换和显式转换。显式转换又可以分为静态转换和动态转换
静态转换:unsigned’(signed);注意单引号。
动态转换:$cast(tgt,src)
2. 类class
在SystemVerilog 中,class 也是一种类型(type),你可以把类定义在program、module、package 中,或者在这些块之外的任何地方定义。类可以在程序或者模块中使用。 类可以被声明成一个参数(方向可以是input、output、inout或者ref),此时被拷贝的是这个对象的句柄,而不是这个对象的内容。
3. 结构体
Verilog 中没有结构体,用户常常以相同的字符开始或结尾来命名信号名,以此表示一组相
关的信号。 SystemVerilog 中增加了类似 C 语言中的结构体类型,可以方便的表示一组相关的信号。结构体表示如下:
struct { int a,b; opcode_t opcode;logic[23:0] address; bit error;
} Instruction_Word;
4. 构造函数
new() 的作用有三点:
1.例化(创建)对象,也就是申请新的内存块来保存对象的变量
2.初始化变量(二值→0;四值→x)
3.返回句柄
class 只有经过了new()函数才真正开辟了内存,否则只是一个空的、没有实际存在。
相关文章:

数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)
注: 资料都是基于网上一些博客分享和自己学习整理而成的 Verilog 1. 数据类型 Verilog一共有19种数据类型 基础四种数据类型:reg型,wire型,integer型,parameter型 reg型 reg类型是寄存器数据类型的关键字。寄存…...

【EtherCAT】CiA402简介
目录 1、CiA402是CANopen协议的子协议 2、CiA402是 用于驱动和运动控制的CANopen设备配置文件 3、 CiA402主要由三部分组成 4、CiA介绍 4.1、操作模式 4.2、对象字典 5、一般对象字定义 6、详细对象字定义 7、Profile position mode 8、Homing mode 9、 Position co…...
嵌入式Linux:模块化编程
目录 内核模块 模块特点 最简单的模块 内核模块的程序结构 模块加载函数 模块卸载函数 模块参数 导出符号 作者简介 内核模块 linux内核整体结构非常庞大,其包含的组件也非常多。 怎么把需要的部分包含在内核中呢? 一种办法是把所有的需要的功能都编译到内核中。…...

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化
目录-基于MatLab2016b实现 一、演化博弈的原理1. 基本概念2. 参与者的策略3.演化过程 二、MATLAB 代码解读(博弈参与主体(双方)策略选择的动态演化讨程)三、MATLAB 代码解读(博弈主体随着时间策略选择的动态演化讨程&a…...

Selenium打开浏览器后闪退问题解决
笔者这两天在做一个自动化方案,用来优化数据统计。其中一部分数据需要通过云上堡垒机跳转访问,而这个堡垒机在笔者日常使用的火狐浏览器上运行不是很正常(表现在有些复制粘贴按钮显示不太灵敏)。 但在Edge浏览器上基本正常&#…...
【图论】最短路应用
1135. 新年好 题目 提交记录 讨论 题解 视频讲解 MarkDown视图Copy 重庆城里有 nn 个车站,mm 条 双向 公路连接其中的某些车站。 每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的…...
Spring Boot实战:使用策略模式优化商品推荐系统
在现代电子商务平台中,个性化的商品推荐系统是提升用户体验和增加销售额的关键。本文将通过一个Spring Boot实战项目,展示如何利用Java的设计模式——策略模式,来优化商品推荐系统。同时,我们将探讨Spring Boot中的一个重要特性&a…...

Navicat导入Sql文件至Mysql数据库,事务失效
Mysql 版本:8.0.39 Navicat 版本:17.x、16.x 结论: Navicat 导入sql文件,事务不会生效,无论怎么设置 mysql.exe 导入sql文件,事务生效 测试 准备一张表 name约束不能为空,用于测试事务失败…...

篮球运动场景物体检测系统源码分享
篮球运动场景物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…...

Docker实操:安装MySQL5.7详解(保姆级教程)
介绍 Docker 中文网址: https://www.dockerdocs.cn Docker Hub官方网址:https://hub.docker.com Docker Hub中MySQL介绍:https://hub.docker.com/_/mysql 切换到“Tags”页面,复制指定的MySQL版本拉取命令,例如 :…...
git reflog
git reflog 是一个非常有用的命令,可以让你查看和回滚到 Git 仓库中的任何之前的状态。reflog 记录了你在 Git 仓库中的所有 HEAD 移动历史。下面是使用 reflog 回滚到之前状态的步骤: 1. 查看 Reflog 首先,你需要查看 reflog 记录…...

使用 Vue 3 和 TypeScript 实现带打字效果的仿 AI 分析展示组件
在这篇博客中,我将分享如何用 Vue 3 和 TypeScript 实现一个带打字效果的 AI 分析展示组件。该组件具有如下功能: 动态打字效果:模拟打字机逐步显示内容。自动滚动:内容超出容器高度时自动滚动到最新位置。 1. 组件实现需求 我…...

数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)
目录 一、安装所需的python包二、采用K-NN算法进行缺失值填充2.1代码(完整代码关注底部微信公众号获取)2.2以某个缺失值数据进行实战2.2.1代码运行过程截屏:2.2.2填充后的数据截屏: 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介…...

爬虫----webpack
目录 一. 什么是webpack 出现的原因:同名函数 概念: 特征:大量缩进 webpack的格式 简单的webpack格式: 详细的webpack格式: 几个参数的运用 1. webpack数组形式 2. webpack对象格式 3.多个js文件打包 打印要扣的代码 …...
Spring Mybatis PageHelper分页插件 总结
1.简介 使用分页插件可以帮助我们自动分页,不用手动在写sql的分页逻辑。 2.配置步骤 在pom.xml中添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.11<…...

9、等保测评介绍
数据来源:9.等保测评介绍_哔哩哔哩_bilibili 信息系统等级测评 信息系统等级测评是测评机构依据国家信息安全等级保护制度的规定,按照相关管理规范和技术标准,对未涉及国家秘密的信息系统的安全等级保护状况进行检测评估的活动。 等级测评…...

解决Gson将长数字( json字符串)转换为科学记数法格式
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。 依赖 Gradle: dependencies {implementation com.google.code.gson:gson:2.11.0 }…...
php环境搭建教程
PHP环境搭建教程 在构建和开发PHP应用程序时,搭建一个稳定、高效的PHP环境是基础且关键的一步。本教程将详细介绍如何在不同操作系统(Windows和Linux)上搭建PHP环境,包括Apache服务器的安装与配置、PHP的安装与配置、MySQL的安装…...

测试ASP.NET Core的WebApi项目调用WebService
虚拟机中部署的匿名访问的WebService,支持简单的加减乘除操作。本文记录在WebApi中调用该WebService的方式。 VS2022创建WebApi项目,然后在解决方案资源管理器的Connected Services节点点右键,选择管理连接的服务菜单。 点击下图圈红处…...

【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study 专栏:用Java学习数据结构系列 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者ÿ…...

Pluto论文阅读笔记
主要还是参考了这一篇论文笔记:https://zhuanlan.zhihu.com/p/18319150220 Pluto主要有三个创新点: 横向纵向用lane的query来做将轨迹投回栅格化地图,计算碰撞loss对数据进行正增强和负增强,让正增强的结果也无增强的结果相近&a…...
Java基础之数组(附带Comparator)
文章目录 基础概念可变参数组数组与ListComparator类1,基本概念2,使用Comparator的静态方法(Java 8)3,常用Comparator方法4,例子 排序与查找数组复制其他 基础概念 int[] anArray new int[10];只有创建对象时才会使用new关键字,所以数组是个…...
B站的视频怎么下载下来——Best Video下载器
B站(哔哩哔哩)作为国内最受欢迎的视频平台之一,聚集了无数优质内容:动漫番剧、游戏实况、学习课程、纪录片、Vlog、鬼畜剪辑……总有那么些视频让人想反复观看、离线观看,甚至剪辑创作。 但你是否遇到过这样的烦恼&am…...

什么是预训练?深入解读大模型AI的“高考集训”
1. 预训练的通俗理解:AI的“高考集训” 我们可以将预训练(Pre-training) 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样,大模型在正式诞生前,也要经历一场声势浩大的“题海战术”…...

【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项
批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项 1、操作步骤1-5: 安装与启动:安装成功后,在桌面或开始菜单找到软件图标,双击启动。 导入图片:进入软件主界面,点击 “导入图片” 按钮&a…...
SQL Server 日期时间类型全解析:从精确存储到灵活转换
SQL Server 日期时间类型全解析:从精确存储到灵活转换 一、引言:日期时间处理的核心挑战 在数据管理中,日期时间类型是最常用却最容易出错的数据类型之一。不同业务场景对时间精度、时区感知、存储效率的需求差异极大: 金融交易…...
损坏的RAID5 第十六次CCF-CSP计算机软件能力认证
纯大模拟 提前打好板子 我只通过4个用例点 然后就超时了。 #include<iostream> #include<cstring> #include<algorithm> #include<unordered_map> #include<bits/stdc.h> using namespace std; int n, s, l; unordered_map<int, string>…...

学习路之php--性能优化
一、php周边优化 二、代码级优化 变量管理 及时unset()释放大数组/对象,减少内存占用局部变量访问速度比全局变量快约2倍,优先使用局部变量大数组采用引用传递(&$var)避免内存 循环优化 预计算循环次数: …...

Rest-Assured API 测试:基于 Java 和 TestNG 的接口自动化测试
1. 右键点击项目的文件夹,选择 New > File。 2. 输入文件名,例如 notes.md,然后点击 OK。 3. 选择项目类型 在左侧的 Generators 部分,选择 Maven Archetype,这将为你生成一个基于 Maven 的项目。 4. 配置项目基…...

基于J2EE架构的在线考试系统设计与实现【源码+文档】
目录 摘要: Abstract: 1 引言 2 在线考试系统构架 2.1 在线考试系统一般需求分析 2.2 当前在线考试系统现状分析 2.3 基于J2EE的在线考试系统架构介绍及拥有的优势 2.3.1 结构总体介绍 2.3.2 客户层组件 2.3.2.1 Applets 2.3.2.2 应用程序客户端 2.3.3 …...