Verilog 基础知识(一) Verilog 基础语法与注意事项

基础知识

 0.1 模块(Module)

        Verilog中的module可以看成一个具有输入输出端口的黑盒子,该黑盒子有输入和输出接口(信号),通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数)

图1  模块示意图

0.1.1 模块描述

图1 所示的顶层模块(top_module)结构用Verilog语言可描述为:

module  top_module(input a,input b,output out
);....... endmodule
  • 模块以module 开始,endmodule结束
  • top_module 为模块名
  • input : 为输入端口
  • output:  为输出端口
  • 所有代码必须处于module模块中

 同理,图1 所示的次级模块(mod_a)结构用Verilog语言可描述为:

module  top_module(input in1,input in2,output out
);....... endmodule

注意事项每个模应单独块处于一个.v文件中,模块名即为文件名(规范代码!)

0.1.2  模块输入输出信号

  • 输出: output
  • 输入: input

模块的输入输出端口都可看出模块的信号,若不写信号类型则默认为wire类型信号

// 以下这两个语句本质是一直的
input a;input wire a;

除了wire型信号,还有reg型信号,具体详见1.4节!

0.1.3 模块实例化

        如图1所示,top_module的两个输入端口连接到次级模块(mod_a)的输入端口,那如何在top_module模块模块中使用mod_a模块的功能呢?这就需要通过模块实例化,可以把top_module看成C语言中的主函数,次级模块mod_a看成普通函数,这样就可以在主函数中调用其他函数来完成相应的功能!

在top_module中实例化mod_a的方式为:

模块实例化语法: 模块名 实例名(定义连接port的信号);

module  top_module(input a,input b,output out
);mod_a instance2 (.in1(a), .in2(b), .out(out));endmodule
  • 按mod_a定义的端口顺序实例化: mod_a instance1 (a, b, out);
  • 按mod_a端口名实例化: mod_a instance2 (.in1(a), .in2(b), .out(out));   (推荐此种写法)

0.2 逻辑块(always、generate)

0.2.1 always逻辑块

        always块可构建 组合逻辑块 和 时序逻辑块,复杂的逻辑操作都需要处于该逻辑块中,如if、case、for等

(1) 组合逻辑块

module top_module();always @(*) begin....endendmodule
  • always逻辑块中任意信号变化时立即触发,执行begin - end之间的语句
  • begin - end用于将多条语句组成一个代码块,只有一条语句时可省略

(1) 时序逻辑电路

module top_module();always @(posedge clk) begin....endendmodule
  • clk 信号的上升沿触发
  • posedge:  上升沿
  • negedge: 下降沿

0.2.2 generate逻辑块

generate主要结合for循环使用,主要用途有:

  • 向量中的多个位进行重复操作
  • 对同一个模块进行多次重复实例化(主要用途)

(1) 操作向量

module top_module(input [7:0] in,  output [7:0] out);genvar i;        // genvar i; 也可以定义在generate内部generatefor(i=0; i<8; i++) begin: bitassign out[i]=^in[8-1:i];endendgenerate
endmodule

(2) 模块重复多次实例化

module  top_module(input a,input b,output out
);genvar i;generatefor(i=0; i<8; i++)  begin: gen_mod_a   //  gen_mod_a 为每个begin_end的结构的名称mod_a instance2 (.in1(a), .in2(b), .out(out));endendgenerate
endmodule
  • 注意:模块多次实例化时必须写每个begin_end结构的名称(gen_mod_a)
  • 仿真器会通过gen_mod_a来标识生成结构: gen_mod_a[0],gen_mod_a[1]....

 0.2.3 initial块 

        initial块可以理解为一个初始化块,在initial的起始位置的语句在0时刻即开始执行,之后如果遇到延时,则延时之后执行接下来的语句

        初始块是不可综合的,因此不能将其转化为带有数字元素的硬件原理图。因此初始块除了在仿真中使用外,并没有太大的作用

如:在仿真文件中初始化各种参数:

initial                                                
begin                                                  sys_clk    = 1'b1;                sys_rst_n  = 1'b0; #50sys_rst_n  = 1'b1;                
end  

注意:

  • initial 块在电路中不可综合,故一般不出现在RTL代码中
  •  initial 一般只在仿真文件中使用

若需要在RTL代码中初始化参数,需要用always块,用initial块会导致错误!

如下所示,在RTL代码中初始化存储器的方式为

reg [255:0]char_data[4:0];always@(posedge clk)beginchar_data[0]     <=  256'h0000000000000000000000000000000000000000000000000000000000000000;char_data[1]     <=  256'h0000000000000000000000000000000000000000000000000000000000000000;char_data[2]     <=  256'h0000000000000000000000200000000000000000002000000008000010000000;char_data[3]     <=  256'h000000000000000000000038000000000000020000380000000600001C000000;char_data[4]     <=  256'h02000000000100000000003E0000000000000700003E0000000780001F000000;end

0.3 赋值方式

Verilog 中赋值方式有三种: 连续赋值、阻塞赋值、非阻塞赋值

0.3.1 连续赋值(assign)

assign x = y;
  • 该语句表示把x和y两个信号进行连接,真实的物理连接
  • 不能在always块中使用

0.3.2 阻塞赋值(=)

// 组合块
always @(*)  beginout1 = a ;a = b ;out2 = a ;
end
  • 组合always块中用阻塞式赋值
  • 执行顺序:按照begin_end语句块中的顺序依次执行,上述输出结果为:out1 = a ,out2 = b

 0.3.3 非阻塞赋值(<=)

// 时序块
always @(posedge clk)  beginout1 <= a ;a <= b ;out2 <= a ;
end
  • 时序always块中用非阻塞赋值
  • 执行顺序:begin_end中所有语句并行执行,上述输出结果为:out1 = a ,out2 = a


第一章   基础语法

1.1 标识符

(1)用途: 标识符用于定义常数、变量、信号、端口、参数名、模块名等。

(2)组成: 字母、数字、$、下划线任意组合而成

(3)注意事项:

  • 区分大小写(Verilog 和 verilog是不同的)
  • 第一个字符只能是字母或下划线(123demo 是非法标识符)

1.2 逻辑值与逻辑运算

1.2.1 逻辑值

Verilog中有4中逻辑值:0、1、x、z

  • 0:  低电平
  • 1:高电平
  • x:  表示状态未知
  • z:表示高阻状态

注意:这里的z、x是不区分大小写的(X、Z也可)

1.2.2 逻辑运算

(1) 逻辑运算符:&&(与)、==(相等)、||(或)、!=(不等)

  • 如 m&&n  : 判断m和n是否全为真(非0即为真),真则输出1'b1,否则输出1'b0 (4’b1010&4’b0101 = 1’b1)
  • 最后输出结果只有1bit

(2) 按位运算符: &、|、~、^、~&、~^、~| 

  • 如 m&n  : 是把m的每一位与n的每一位按位做与运算 (4’b1010&4’b0101 = 4’b0000)
  • 输出结果与m/n的bit数相同

(3) 归约运算符:  &、|、~、^、&、~^、~| 

  • 只有一个参量参与运算时( &为一元运算符),表示规约与,即向量内部进行与运算
&a [3:0] // AND:a[3]&a[2]&a[1]&a [0]相当于(a[3:0]== 4'hf)
|b [3:0] // OR: b[3]|b[2]|b[1]|b [0]相当于(b[3:0]!= 4'h0)
^c [2:0] // XOR:c[2]^c[1]^c[0]
  • 即(&4’b0101 = 0&1&0&1 = 1'b0 )
  • 最后输出结果只有1bit

1.3 常量的表示方法

与C语言类似,常量主要有:整数型、实数型和字符串型三种

1.3.1 用十进制整数表示整型常量

(1) 正数: 直接写 10 表示位宽为32bit的十进制整数(系统默认)

(2) 负数:  -10需要用二进制补码表示,多了一位符号位(1 1010)

(3) 用科学计数法表示:12.345e3   表示 12345

1.3.2 用基数法表示整数型常量

[换算成二进制数后的位宽]'[数制符号][与数制对应的值]

(1) 二进制(b):     8'b1000_1100      

(2) 十六进制(h):  8'h8c

(3) 八进制(o):      8'o214

(4) 十进制(d):      8'140

注意事项:

  • 当表示二进制时,最好每4位写一个下划线以增强可读性:如8'b1000_1100   与8'b10001100 是一样的
  • 基数表示法中遇到x时:十六进制表示4个x,八进制中表示3个x  
  • 当位宽大于二进制位数时左边自动补0,小于二进制数时2从左边截断

1.3.3 字符串(用双引号)

(1) 每个字符由1个8位的ASCII码值表示,即需要1byte存储空间

(2) 如:“Hello world”   字符串由11个ASCII符号构成,需要11byte存储空间

1.3  注释方式

Verilog中注释主要有行注释(//)和块注释(/*  ....     */)两种,表示方法与C语言一致!

// 行注释/*块注释*/

1.4 变量(wire、reg)

Verilog中的变量主要有两种: wire和reg

1.4.1 wire

(1) 线网型(wire): 表示电路间的物理连接,wire定义的变量也可看成信号端口

(2) 当两个wire信号被连续赋值时,在逻辑块中会被映射成真实的物理连线,此时这两个信号端口的变化是同步的

wire a;wire b;assign b = a;    // 表示a与b之间生成实际的物理连线

1.4.2 reg

(1) 寄存器型(reg): 表示一个抽象的数据存储单元

(2) reg 具有对某一时间点状态进行保持的功能

1.4.3 用法与注意事项

(1) always、initial语句中被赋值的变量(赋值号左边的变量)都是reg型变量

(2) 在assign语句中被赋值的变量,为wire型变量

1.5 向量(vector)与 参数(常量)

1.5.1 parameter 参数(常量)

(1) 参数是一种常量,通常出现在module内部,常被用于定义状态、数据位宽等

parameter STATE = 1'b0;

(2) 只作用于声明的那个文件,且可以被灵活改变

(3) 局部参数localparam,只在本模块中使用

localparam  STATE= 1'b1’;

(4) 参数的名称一般为大写,以区分其他变量 

1.5.2 向量(vector)

vector(向量),是一组信号的集合,可视为位宽超过1bit  的 wire 信号。

(1) 定义方式:

格式:input/output  wire/reg [upper:lower] vector_name//输入输出型
input [7:0] a,b,
output reg [7:0] out// 模块中间向量
wire [7:0] c, e;
reg [7:0] d;
  • [upper:lower] 定义位宽,如 [7:0] 表示位宽为8 bit ,即upper=7,lower=0
  • vector_name可以一次写多个向量

1.5.3 向量片选

  • a[3:0]   取向量a的0~4位数据
  • b[n]      取向量b的第n位数据
  • c[-1:-2]  取向量c的最低2位数据
  • c[0:3]     取向量c的最高4位数据

多路选择器应用:实现一个 256 选 1 选择器,sel 信号作为选择信号,当 sel = 0 时选择 in[3:0],sel = 1 时选择 in[7:4],以此类推。

module top_module (input [1023:0] in,input [7:0] sel,output [3:0] out
);assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};// assign out = in[sel*4 +: 4];		// assign out = in[sel*4+3 -: 4];	
endmodule
  • 片选信号sel输入为n位二进制数,当参与运算、充当索引时会自动转换成十进制数
  • 该题所选取的信号片段为: in[sel*4+3: sel*4] ,但这不符合Verilog的片选语法规则故应写成:
    in[sel*4 +: 4]   表示索引从sel*4开始的高4bit信号
    in[sel*4+3 -: 4] 表示索引从sel*4+3开始的低4bit信号
  • 或是直接选出需要的每一位,再用{ }拼接成新向量:
    {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]}

参考文章:HDLBits:在线学习 Verilog (十三 · Problem 60-64) - 知乎 (zhihu.com)

1.6 三元表达式

(1) 与C语言相同,Verilog也有三元表达式

condition ? if_true : if_false

当条件为真,表达式值为if_true ,否则表达式值为if_false。

(2) 应用

(sel ? b : a)   // 一个二选一MUX,通过sel的值选择a或者balways @(posedge clk)         // 一个T触发器q <= toggle ? ~q : q;assign out = ena ? q : 1'bz;  // 三态缓冲器

(3) 参考文章: HDLBits:在线学习Verilog(八 · Problem 35-39) - 知乎 (zhihu.com)

1.7 分支语句(if-else、case)

1.7.1 if-else语句

(1) 最常用的形式:(优势:输出的所有可能都写到,不存在未知电平输出!)

if(<条件表达式 1>)语句或语句块 1;
else if(<条件表达式 2>)语句或语句块 2;………
else语句或语句块 n;

(2)  不建议使用if-else嵌套,会存在优先级问题,导致逻辑混乱,

(3)  所有if-else语句都应写成(1)的形式

(4) 根据条件表达式依次比较,存在优先级

1.7.2 case 语句

(1) 书写形式:

case(<控制表达式>)<分支语句 1> : 语句块 1;<分支语句 2> : 语句块 2;<分支语句 3> : 语句块 3;………<分支语句 n> : 语句块 n;default : 语句块 n+1;
endcase

比较<控制表达式>与<分支语句n>的取值相等则执行对应语句,否则执行default后语句!

(2) 执行完某一分支语句后立即跳出case语句结构,终止case语句执行。

(3) <分支语句n>的取值必须互不相同

(4) 以encase结束case语句块

(5) 各分支语句间不存在优先级

(6) 具体应用: 用case语句搭建多路选择器,(以9选1多路选择器为例)

module top_module( input [15:0] a, b, c, d, e, f, g, h, i,input [3:0] sel,output [15:0] out );always @(*) begincase(sel)4'h0:begin out = a; end4'h1:begin out = b; end4'h2:begin out = c; end4'h3:begin out = d; end4'h4:begin out = e; end4'h5:begin out = f; end4'h6:begin out = g; end4'h7:begin out = h; end4'h8:begin out = i; enddefault: out = 16'hffff;endcaseend
endmodule

1.8 for循环语句

(1) 书写形式:

integer i;
always @(*)  begin for(i=0; i<n; i++)  begin: for_name<循环语句>end
end
  • 执行<循环语句>n次
  • for_name为每一次循环的名称

1.9 关系运算符(>、<、>=、<=)

  • 运算结果为真返回 1
  • 运算结果为假返回 0
  • 若某个操作数值不定(x),则返回值为 x

2.0  拼接运算符({ , })

2.0.1 拼接

用一对花括号加逗号组成“{ , }”拼接运算符,逗号隔开的数据按顺序拼接成新数据

wire [1:0] a;
wire [3:0] b;
wire [5:0] c;
wire [11:0] d = {a, b, c} 

2.0.2 通过拼接实现移位

在左边拼接实现右移,右边拼接实现左移!

always @(posedge clk) beginif(rst_n == 1'b0)out <= 4'b0;elseout <= {in, out[3:1]};    // 右移
end

2.0.2 连接符中重复多次的操作

语法: {重复次数{vector}}

{3{a}} = {a, a, a}
{3'd5, {2{3'd6}}}   // 9'b101_110_110.

2.1  移位运算符

移位运算符用于将左边操作数左移或右移指定的位数!移位后空闲位用0填充

  • 左移运算符: <<

如: 4‘b1101 << 3 结果为:4‘b1000

  • 右移算法符:   >>

如: 4‘b1101 >> 3 结果为:4‘b0001 

  • 移位运算符其他用途:左移一位可以看成是乘以 2,右移一位可以看成是除以 2
  • 移位运算符代替乘除法可以节省资源!

3  二进制全加器

  • a、b为输入 1bit 数据
  • cin为上一个加法器进位输入
  • cout为本加法器的进位输出
  • sum = a+b

代码实现:

module add1 (input a,input b,input cin,	output sum,output cout
);assign sum = a^b^cin;assign cout = (a&b) | (a&cin) | (b&cin);
endmodule

4 16进制全加器

16进制全加器如上图所示,它可由上节中16个二进制全加器组合而成。

用Verilog实现16进制全加器代码为:

module add16 (	input [15:0] a,input [15:0] b,input cin,output [15:0] sum,output cout
);wire [16:0] Add_cin;assign Add_cin[0] = cin;    // 上图中第一个二进制加法器进位输入为0 assign Add_cin[0] = 1b'0;//  用 generate 进行模块多次实例化
// generate 应用范围:对矢量(vector)多个位重复操作,模块重复实例化genvar i;generatefor(i=0; i<16; i++) begin: gen_add16		// gen_add16 为每个begin_end的结构,仿真器会通过他来标识生成结构,gen_add16[0],gen_add16[1]....add1 Add16(.a(a[i]), .b(b[i]), .cin(Add_cin[i]), .sum(sum[i]), .cout(Add_cin[i+1]));endendgenerateassign cout = Add_cin[16];endmodule

5 模块中的参数传递

5.1 定义可传递参数的模块

module counter
// 参数传递
#(parameter COUNT_MAX = 25'd24_999_999,parameter STATE     = 1'b0            // 多个参数用逗号隔开
)
(input  wire  sys_clk,output reg led_out
);
// 代码主体
endmodule

5.2 带参数模块的实例化

// 参数传递
#(.COUNT_NUM( 25'd24_999_999),        // 传入参数.STATE(1'b0)
)
counter1_init      // 实例化模块的名称位置
(.sys_clk   (sys_clk),.led_out(led_out)
); 

参考资料:

[1] 野火《FPGA Verilog开发实战指南》:[野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开发板 — [野火]FPGA Verilog开发实战指南——基于Altera EP4CE10 征途Pro开发板 文档 (embedfire.com)https://doc.embedfire.com/fpga/altera/ep4ce10_pro/zh/latest/index.html

[2] HDLBits中文导学:HDLBits 中文导学 - 知乎 (zhihu.com)

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

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

相关文章

【Redis】Redis整合SSMRedis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

目录&#xff1a; 目录 一&#xff0c;SSM整合redis 二&#xff0c;redis注解式缓存 三&#xff0c;Redis中的缓存穿透、雪崩、击穿的原因以及解决方案&#xff08;附图&#xff09; 一&#xff0c;SSM整合redis 1.原因&#xff1a; 整合SSM和Redis可以提升系统的性能、可…

2023 年如何学习编程

在当今的数字时代&#xff0c;程序员的角色比以往任何时候都更加重要。编程技能几乎在每个行业都受到高度重视和追捧。从科技初创公司到成熟企业&#xff0c;对具有适当技术能力的开发人员的需求巨大。 无论是考虑转行还是开始&#xff0c;现在都是成为一名程序员的激动人心的…

2023世界传感器大会开幕,汉威科技多领域创新产品引瞩目

11月5日&#xff0c;2023世界传感器大会在郑州国际会展中心正式拉开帷幕。据悉&#xff0c;本次大会由河南省人民政府、中国科学技术协会主办&#xff0c;郑州市人民政府、河南省工业和信息化厅、河南省科学技术协会、中国仪器仪表学会承办。 大会由“一会一赛一展”组成&#…

【Liunx系统编程】命令模式3

目录 一&#xff0c;zip/unzip压缩指令 二&#xff0c;tar打包/压缩/解包指令 三&#xff0c;uname获取系统信息指令 四&#xff0c;Liunx下常用且重要的按键和关机指令 五&#xff0c;文件之间的互传 1&#xff0c;Windows与Linux之间的互传 2&#xff0c;Linux系统之间…

3.22每日一题(二重积分求平面区域面积)

先复习求平面积分的公式 注&#xff1a;面对平面积分直接使用二重积分对1求积分即可&#xff1b;所以只需要背二重积分的两个公式&#xff1a; 1、直角坐标下对1积分 2、极坐标下对1积分 xy-1是等轴双曲线&#xff01;&#xff01; 1、先画图定区域 2、选择先对x积分还是先对…

深入了解Typescript中type和interface具体区别?

前言 新手刚开始学习 TypeScript 时&#xff0c;往往会对 type 和 interface 的使用场景和方式感到困惑。因此&#xff0c;本文旨在总结 type 和 interface 的概念和用法。 一、概念 type&#xff1a;类型别名 概念&#xff1a;允许为一个或多个数据类型&#xff08;例如 str…

android studio app红叉无法编译

1.起源 今天前台小姐姐穿了一个白色的超短裙,和小姐姐聊了聊人生梦想,聊生活趣事,回到工位你马....报了一个这错误,无法运行了,明天就要打包测试了,顿时菊花一紧,急了一头汗,这你马咋回事,看了旁边的产品肥仔,迷着小眼露出了银建的笑容.开始排雷.... 意思就是说gradle初始化失…

WARNING: tokenization mismatch: 403 vs. 406. (ignored) LLaVa

LLaVa换BaiChuan底座报错 WARNING: tokenization mismatch: 403 vs. 406. (ignored) 解决 cd ~/.cache/huggingface/hub/models--baichuan-inc--Baichuan2-7B-Base/snapshots/0cc6a61c06cd0734270151109d07cf86ef0ace53 vim tokenizer_config.json把bos_token改成true&#…

RK3568平台 内存的基本概念

一.Linux的Page Cache page cache&#xff0c;又称pcache&#xff0c;其中文名称为页高速缓冲存储器&#xff0c;简称页高缓。page cache的大小为一页&#xff0c;通常为4K。在linux读写文件时&#xff0c;它用于缓存文件的逻辑内容&#xff0c;从而加快对磁盘上映像和数据的访…

在jupyter中使用R

如果想在Jupyter Notebook中使用R语言&#xff0c;以下几个步骤操作可行&#xff1a; 1、启动Anaconda Prompt 2、进入R的安装位置&#xff0c;切换到R的安装位置&#xff1a;D:\Program Files\R\R-3.4.3\bin&#xff0c;启动R&#xff0c;具体代码操作步骤如下&#xff0c;在…

1200*D. Same Differences(数学推公式)

Problem - 1520D - Codeforces 解析&#xff1a; 统计 a [ i ] - i #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; signed main(){scanf("%lld",&t);while(t--){scanf("%lld",&n);…

AI芯片架构体系综述:芯片类型CPU\GPU\FPGA\ASIC以及指令集CSIS\RISC介绍

大模型的发展意味着算力变的越发重要&#xff0c;因为大国间科技竞争的关系&#xff0c;国内AI从业方在未来的一段时间存在着算力不确定性的问题&#xff0c;与之而来的是许多新型算力替代方案的产生。如何从架构关系上很好的理解计算芯片的种类&#xff0c;并且从计算类型、生…

【1106】记录

有关python环境&#xff01;&#xff01;&#xff01; 1、python解释器就是 python 3.7.2 之类的。 VSCode 是代码编辑器。 下图的每一个都是可选的python环境&#xff0c;Python 3.8.3&#xff08;‘base’&#xff09;是下载在电脑上的python环境&#xff08;下载miniConda时…

2021年电工杯数学建模B题光伏建筑一体化板块指数发展趋势分析及预测求解全过程论文及程序

2021年电工杯数学建模 B题 光伏建筑一体化板块指数发展趋势分析及预测 原题再现&#xff1a; 国家《第十四个五年规划和 2035 年远景目标纲要》中提出&#xff0c;将 2030 年实现“碳达峰”与 2060 年实现“碳中和”作为我国应对全球气候变暖的一个重要远景目标。光伏建筑一体…

如何对ppt文件设置修改权限?

PPT文件会应用在会议、演讲、课件等工作生活中&#xff0c;当我们制作好了PPT之后&#xff0c;保护内容防止在演示时出错是很重要的&#xff0c;那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…

微信小程序文件上传wx.uploadFile

网页版查看了一下负载要求是这样 wx.uploadFile({url: ${wx.getStorageSync(apiUrl)}//sysFileInfo/upload?token${wx.getStorageSync(token)}, // 仅为示例&#xff0c;非真实的接口地址filePath: files[0].url,name: file,formData: {secretFlag: Y },success: (res) > {…

【漏洞复现】Django _2.0.8_任意URL跳转漏洞(CVE-2018-14574)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2018-14574漏洞名称Django任意URL跳转漏洞漏洞…

R语言piecewiseSEM结构方程模型在生态环境领域实践技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

「Verilog学习笔记」异步复位的串联T触发器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 这道题目里我们有两个需要明确的点&#xff1a; 1. 什么是异步复位 2. 什么是串联的T触发器 关于第一个点&#xff0c;可以看我的这篇文章&#xff0c;已经整理好了&a…

通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃

系列文章目录 C程序异常调查专栏 文章目录 系列文章目录前言一、GFlags是什么&#xff1f;二、如何获取GFlags三、使用步骤1.确认GFlags是否已经安装2.以管理员权限启动Command prompt3.GFlags有效设定4.检查GFlags有效设定是否成功5.根据客户复现步骤运行程序 总结 前言 客户…