【VCS Verdi】VCS Verdi 联合仿真总结

news2024/12/23 14:42:22

1. VCS 介绍

VCS是编译型 Verilog 模拟器,它完全支持 OVI 标准的 Verilog HDL 语言、PLI 和 SDF。VCS 具有行业中较高的模拟性能,其出色的内存管理能力足以支持千万门级的 ASIC 设计,而其模拟精度也完全满足深亚微米 ASIC Sign-Off 的要求。

VCS 对文件的处理主要分为以下几个部分:

  • 原始的 .v 文件输入。

  • 转换成 .c 文件。

  • 编译成可执行的二进制文件。

  • 最后生成 simv,即可查看仿真的结果。

VCS 有三步法和两步法,三步法用于仿真混合语言,比如 Verilog 和 VHDL 的混合,而两步法用于仿真单种语言,一般都只仿真 Verilog 语言,因此这里只介绍两步法。

两步法分为:

  • Compilation 编译。编译是仿真设计的第一步。在这个阶段,VCS 构建实例层次结构并生成一个二进制可执行文件 simv。这个二进制可执行文件稍后将用于仿真。

  • Simulation 仿真。在编译过程中,VCS生成一个二进制可执行文件simv。可以使用 simv 来运行仿真。


2. 常用的编译指令

编译命令的格式:vcs sourcefile [compile_time_option] (编译选项用来控制编译过程),可以另外加一些命令,比如:debug_all(加入单步调试功能)、-sverilog(提供对systemverilog的支持)等

常见的编译命令如下:

  • -v lib_file:lib_file 是 Verilog 文件,包含了引用的 module 的定义,可以是绝对路径,也可以是相对路径。

  • -y lib_dir:lib_dir 是参考库的目录,vcs 从该目录下寻找包含引用的 module 的 Verilog 文件,这些文件的文件名必须和引用的 module 的名一样。

  • -full64:vcs 以 64 位模式编译,生成 64 位的 simv,如果不加这条命令则无法生成 simv。

  • -R:编译后立即进行仿真。

  • +v2k:支持 Verilog 2001 标准。

  • -sverilog:提供对 Systemverilog 的支持。

  • -l log_file:用于将编译产生的信息放在 log 文件内。

  • -debug_all:用于产生debug所需的文件。

  • -Mupdate:源文件有修改时,只重新编译有改动的.v文件,节约编译时间。

  • -timescale=1ns/1ns 设置仿真精度,可以根据实际需要进行更改。

  • -kdb:-kdb 选项支持输出 kdb 格式的数据,用于与 Verdi 在交互模式交换数据,而 kdb 格式属于 "Limited Customer Availability" 特性,必须通过 -lca 选项开启。


3. Verdi 介绍

Verdi 和 VCS 一样也是 Synopsys 公司的软件,它是一款强大的仿真波形查看器,通过查看波形进行 debug 会更高效,配合着 VCS 共同进行仿真验证是众多公司的选择,因此学习 VCS 联合 Verdi 进行仿真很有必要。

在 testbench 中添加以下系统函数,用于生成 .fsdb 文件,fsdb文件是 Verdi 可识别的波形文件。

initial begin
    $fsdbDumpfile("*.fsdb");
    $fsdbDumpvars(0);
end

以下为常见的fsdb波形文件的系统函数及其含义。

如果要Dump FSDB波形,将以下语句选择性加在TB中。

initial begin
    $fsdbDumpfile(“dump.fsdb”) ;           //fsdbDumpfile - 指定FSDB文件名
    $fsdbDumpvars(level,start_module) ;    //要记录的信号,level=0表示记录所有
    $dumpvars(2, top. u1);                 // Dump实例top. u1及其下一层的信号
    $fsdbDumpMDA();                        //fsdb dump波形时会记录二维数组2D array signal的值,
                                             便于在verdi中debug查memory内部信号。
    $fsdbDumpSingle;               //Dump指定的信号
    $fsdbDumpvariable;              //Dump指定的VHDL变量
    $fsdbSwitchDumpFile(“<newFSDBname>”);  //将dumping切换到另一个FSDB文件
    $fsdbAutoSwitchDumpfile(<filesize>, “<FSDBname>”,< numberoffile>);        
                                           //限制文件大小并在数据量过大时自动创建新的FSDB文件
    $fsdbDumpMem(<regname>, [<startaddr>, [<size>]]);
    $fsdbDumpoff;                          //停止记录
    $fsdbDumpon;                           //重新开始记录
    $fsdbDumplimit();                      //限制VCD文件的大小(以字节为单位)
    $fsdbDumpall;                          //记录所有指定的信号值
end

4. makefile 书写

如果使用终端手敲命令的方法进行 VCS 和 Verdi 的仿真,会显得过于麻烦,不仅费时间而且容易出错,因此可以通过 makefile 脚本的形式对整个过程的命令自动化,在对不同的文件进行仿真时,只需要修改部分内容即可重复使用,非常便捷。

以下为 Makefile 的脚本,可以使用 “make all” 命令实现从 VCS 编译到 Verdi 查看波形等一系列操作的自动化。

PRJ = /home/ICer/Project/prj
​
FILENAME = $(PRJ)/*.v 
OUTPUT = sync_fifo
​
#仿真并打开vcs verdi界面
all:clean elab run verdi
​
elab:
    vcs -full64 -LDFLAGS -Wl,-no-as-needed -debug_acc+all -timescale=1ns/1ns -fsdb -sverilog -l comp.log ${FILENAME}
​
run:
    ./simv -l ${OUTPUT}.log ${FILENAME}
​
rung:
    ./simv -gui -l run.log ${FILENAME}
​
verdi:
    verdi ${FILENAME} -ssf ./*.fsdb &
​
clean:
    rm -rf ./csrc *.daidir *.log simv* *.key *.vpd ./DVEfiles verdiLog novas*

5. 文件准备

现在用一个实际例子,用来演示 VCS 联合 Verdi 进行仿真,这里以一个简单的同步 FIFO 为例,以下为同步 FIFO 的 Verilog 实现。

`timescale1ns/1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/05/07
// Design Name: 
// Module Name: Sync_FIFO
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 同步FIFO的verilog实现
// Dependencies: 
// Revision:
// Additional Comments:
// 
//
​
​
moduleSync_FIFO#(
    parameter   DATA_WIDTH          =8,                      //数据位宽
    parameter   FIFO_DEPTH          =8,                      //FIFO的深度
    parameter   ALMOST_FULL_DEPTH   =7,                      //将满的深度
    parameter   ALMOST_EMPTY_DEPTH  =1,                      //将空的深度
    parameter   ADDR_WIDTH          =3,                      //地址位宽
    parameter   READ_DATA_MODE      =0                       //读取的模式,0为组合逻辑。1为时序逻辑
    )(   
    input                           clk,  
    input                           rst_n,  
    input                           wr_en,  
    input                           rd_en,  
    input       [DATA_WIDTH-1:0]    wr_data,                     
    output  reg[DATA_WIDTH-1:0]    rd_data,  
    output                          almost_full,                 
    output                          almost_empty,   
    output                          full,                 
    output                          empty,        
    output  reg                     overflow,                 //上溢出信号
    output  reg                     underflow                 //下溢出信号
    );
​
    reg   [ADDR_WIDTH-1:0]          wr_ptr;                   //写指针
    reg   [ADDR_WIDTH-1:0]          rd_ptr;                   //读指针
    reg   [ADDR_WIDTH:0]            fifo_cnt;                 //使用的FIFO空间计数
    reg   [DATA_WIDTH-1:0]          buf_mem[FIFO_DEPTH-1:0]; //创建数组作存储     
​
  //对FIFO空间使用作计数
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      fifo_cnt <='d0;
    end
    elseif(wr_en&&~full&&rd_en&&~empty)begin
      fifo_cnt <=fifo_cnt;
    end
    elseif(wr_en&&~full)begin
      fifo_cnt <=fifo_cnt+'d1;
    end
    elseif(rd_en&&~empty)begin
      fifo_cnt <=fifo_cnt-'d1;
    end
    elsebegin
      fifo_cnt <=fifo_cnt;
    end
  end
​
  //写指针
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      wr_ptr <='d0;
    end
    elseif(wr_en&&~full)begin
      wr_ptr <=wr_ptr+'d1;
    end
    elseif(wr_ptr==FIFO_DEPTH-1)begin
      wr_ptr <='d0;
    end
    elsebegin
      wr_ptr <=wr_ptr;
    end
  end
​
  //读指针
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      rd_ptr <='d0;
    end
    elseif(rd_ptr==FIFO_DEPTH-1)begin
      rd_ptr <='d0;
    end
    elseif(rd_en&&~empty)begin
      rd_ptr <=rd_ptr+'d1;
    end
    elsebegin
      rd_ptr <=rd_ptr;
    end
  end
​
  //数据写入
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      buf_mem[wr_ptr] <='d0;
    end
    elseif(wr_en&&~full)begin
      buf_mem[wr_ptr] <=wr_data;
    end
    elsebegin
      buf_mem[wr_ptr] <=buf_mem[wr_ptr];
    end
  end
​
  //根据模式的选择将数据读出,模式0为组合逻辑输出,模式1为时序逻辑输出
  generate
    if(READ_DATA_MODE=='d0)begin
      always @(*)
      rd_data=buf_mem[rd_ptr];                          //组合逻辑输出
    end
    elsebegin
      always @(posedgeclkornegedgerst_n)begin
        if(!rst_n)begin
          rd_data <='d0;
        end
        elseif(rd_en&&~empty)begin
          rd_data <=buf_mem[rd_ptr];                     //时序逻辑输出
        end
        elsebegin
          rd_data <=rd_data;
        end
      end
    end   
  endgenerate
​
  //上溢出信号
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      overflow <='d0;
    end
    elseif(wr_en&&full)begin
      overflow <='d1;
    end
  end
​
  //下溢出信号
  always @(posedgeclkornegedgerst_n)begin
    if(!rst_n)begin
      underflow <='d0;
    end
    elseif(rd_en&&empty)begin
      underflow <='d1;
    end
  end
​
  //定义将满、将空、满、空信号
  assignalmost_full=(fifo_cnt >=ALMOST_FULL_DEPTH);
  assignalmost_empty=(fifo_cnt <=ALMOST_EMPTY_DEPTH);
  assignfull=(fifo_cnt==FIFO_DEPTH);
  assignempty=(fifo_cnt=='d0);
​
endmodule

此外,还需要准备其对应的 testbench,如下所示。

//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/05/07
// Design Name: 
// Module Name: tb_Sync_FIFO
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 同步FIFO的testbench文件
// Dependencies: 
// Revision:
// Additional Comments:
// 
//
`timescale1ns/1ns
​
moduletb_Sync_FIFO(); 
​
    parameter         DATA_WIDTH=8;
    parameter         FIFO_DEPTH=8;
    parameter  ALMOST_FULL_DEPTH=7;
    parameterALMOST_EMPTY_DEPTH=1;
    parameter         ADDR_WIDTH=3;
    parameter     READ_DATA_MODE=1;
​
    reg                    clk;
    reg                    rst_n;
    reg                     wr_en;
    reg                     rd_en;
    reg  [DATA_WIDTH-1:0] wr_data;
    wire[DATA_WIDTH-1:0]  rd_data;
    wire                    almost_full;
    wire                    almost_empty;
    wire                    full;
    wire                    empty;
    wire                    overflow;
    wire                    underflow;
​
    initialbegin
        clk=0;
        rst_n=0;
        #50
        rst_n=1;
    end
​
    always#10clk=~clk;
​
    initialbegin
        wr_en=0;
        rd_en=0;
        wr_data=0;
    end
​
    initialbegin
        #100
        send_wr;
    end
​
    initialbegin
        #400
        send_rd;
        #1000;
        $finish;
    end
​
    //创建写任务
    integeri;
    tasksend_wr;
    begin
        for(i=0;i<8;i=i+1)begin
            @ (posedgeclk)begin
                wr_en <='d1;
                wr_data <=i+1;
            end
        end
        @ (posedgeclk)begin
            wr_en <='d0;
            wr_data <='d0;
        end
        repeat(10)@ (posedgeclk);
    end
    endtask
​
    //创建读任务
    tasksend_rd;
    begin
        for(i=0;i<8;i=i+1)begin
            @ (posedgeclk)begin
                rd_en <='d1;
            end
        end
        @ (posedgeclk)begin
                rd_en <='d0;
        end
    end
    endtask
​
    Sync_FIFO#(
        .DATA_WIDTH        (DATA_WIDTH),
        .FIFO_DEPTH        (FIFO_DEPTH),
        .ALMOST_FULL_DEPTH (ALMOST_FULL_DEPTH),
        .ALMOST_EMPTY_DEPTH(ALMOST_EMPTY_DEPTH),
        .ADDR_WIDTH         (ADDR_WIDTH),
        .READ_DATA_MODE    (READ_DATA_MODE)
    )inst_Sync_FIFO(
        .clk                (clk),
        .rst_n              (rst_n),
        .wr_en              (wr_en),
        .rd_en              (rd_en),
        .wr_data            (wr_data),
        .rd_data            (rd_data),
        .almost_full      (almost_full),
        .almost_empty      (almost_empty),
        .full               (full),
        .empty              (empty),
        .overflow           (overflow),
        .underflow          (underflow)
    );
​
    initialbegin
        $fsdbDumpfile("tb_Sync_FIFO.fsdb");
        $fsdbDumpvars(0);
        $fsdbDumpMDA();
    end
​
endmodule

有几点需要注意:

  • 添加仿真精度和仿真单位。

`timescale 1ns/1ns
  • 添加停止仿真系统函数。如果不加的话仿真会一直仿真不停止,导致无法观察仿真波形。

$finish
  • 添加仿真需要的系统函数,$fsdbDumpfile 表示生成的 fsdb 文件名,用于 Verdi 查看波形;$fsdbDumpvars 表示需要查看的信号,0 表示所有信号都将纳入观察;$fsdbDumpMDA 表示 fsdb dump 波形时会记录二维数组 2D array signal 的值,便于在 Verdi 中 debug 查 memory 内部信号。

initial begin
$fsdbDumpfile("tb_Sync_FIFO.fsdb");
$fsdbDumpvars(0);
$fsdbDumpMDA();
end

6. 实操练习

接下来直接进行最后的实操仿真,打开终端进入到工程目录下。

ls 查看当前目录所含的文件,可以看到包含有同步 FIFO 的 .v 文件以及对应的 TB 文件,另外还有实现自动化的 makefile 脚本文件。

根据前面 makefile 的说明,直接使用 make all 命令即可实现自动仿真。

随后会显示一些信息,如顶层文件,仿真精度和单位等。

同时也会打印 VCS 仿真报告。

随后会自动弹出 Verdi 的 GUI 界面。

  • 第一部分为菜单栏部分,这里可以进行查看电路图、加载源文件等操作。

  • 第二部分为当前加载的文件层次结构,可以看到顶层文件为 sync_fifo,因为当前只有一个文件,所以毫无疑问顶层文件只能是它,如果包含多个设计文件,含有顶层及子模块,这里就会清晰的显示出来。

  • 第三部分为设计文件的内容显示,同时在后续会介绍可以直接通过这里查看相应信号的波形。

  • 第四部分为波形显示区,这里就是 Verdi 最重要的区域,我们就是通过这里查看信号波形进行 debug 的。

但是这是可以看到在波形显示区并没有波形出现,这时需要我们手动选择添加观察信号,鼠标选择要观察的模块信号,并按下快捷键“CTRL + 4”,即可将选中模块所包含的信号加入到波形观察区中。

此外在前面埋下伏笔说了可以在代码观察区添加观察信号,在 debug 时,有时需要观察非端口信号,比如在内部定义的 reg/wire 信号,这时就可以在代码观察区添加,比如我要观察在内部定义的写使能信号 wr_en,鼠标选中此信号,按下快捷键“CTRL + w”即可将信号添加至观察区进行 debug。

可以看到当前的波形太大,不利于我们观察,可以按 F 键,便会自动将波形整形成最适合当前的比例。

另外可以通过上方的按钮将波形进行放大和缩小,也可以通过按住 CTRL 键在滑动鼠标滚轮将波形进行放大和缩小。

当添加的模块信号太多时,会显得很杂乱,可以将其分组分类进行观察,只需要将同组的信号选中向下拖拽即可。下图将信号分为五组。

过多的信号都是同一种颜色容易看花,可以将不同类的信号设置成不同的颜色,便于区分,只需选中信号,按 T 键即可切换颜色。

另外选中信号右击鼠标会出现一列菜单栏,在这里可以更改信号的进制、形式(数字或模拟)、重命名等操作,这里就不一一操作了,如果之前使用过 Vivado、Modelsim等工具,相信这些操作还是很容易上手的。


7. 总结

这篇文章只介绍,VCS 和 Verdi 最基本的操作,更多高阶的操作可以查看其官方手册,也可以在平时的练习中不断加强对软件操作的熟练度,工具学起来还是比较容易的,难的是如何对设计进行快速的仿真并找出其中的 bug,这需要在未来长期学习训练与总结。

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

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

相关文章

C++模拟实现优先级队列(priority_queue)

目录 一、 仿函数 1.1仿函数的概念使用 1.2模拟实现仿函数 二、优先级队列&#xff08;priority_queue) 2.1 优先级队列概念 2.2 优先级队列使用 2.3 模拟实现优先级队列 2.3.1 优先级队列类框架 2.3.2 模板参数 2.3.3 构造函数 2.3.4 仿函数 2.3.5 adjust_up (堆向…

linux系统中QT里面信号与槽的实现方法

大家好&#xff0c;今天主要来聊一聊&#xff0c;QT中信号与槽的使用方法。 目录 第一&#xff1a;QT中信号与槽简介 第二&#xff1a;如何在项目里创建信号 第三&#xff1a;如何在项目中创建槽 第四&#xff1a;项目中连接信号与槽 第一&#xff1a;QT中信号与槽简介 在学…

遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)

遥感图像处理&#xff1a;最小噪声分离变换&#xff08;Minimum Noise Fraction Rotation&#xff0c;MNF Rotation1.PCA变换2.MNF3.PCA和MNF1.PCA变换 在统计学中&#xff0c;主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中…

Django使用Celery异步发送短信(Django4.1.3+Celery5.2.7+ubuntu)

首先要下载Celery&#xff0c;直接pip就好 我的redis配置 CACHES {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.2.128:6379/0","OPTIONS": {"CLIENT_CLASS"…

自动化测试Seleniums~2

webdriver API 1.如何打开网页以及如何关闭一个浏览器。 package test_20230107;import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver;import static java.lang.Thread.sleep;public class Test {public static void main(String[] args)…

JavaEE多线程-线程的状态和安全问题

目录一、线程中的基本状态二、线程安全问题三、线程安全的标准类四、synchronized 关键字-监视器锁monitor locksynchronized 的特性五、volatile 关键字一、线程中的基本状态 NEW: 安排了工作, 还未开始行动, 就是创建了Thread对象, 但还没有执行start方法(内核里面还没有创建…

SpringSecurity(十一)【跨域】

十一、跨域 简介 跨域问题实际应用开发中的一个非常常见的需求&#xff0c;在 Spring 框架中对于跨域问题的处理方案有好几种&#xff0c;引入了 Spring Security 之后&#xff0c;跨域问题的处理方案又增加了 什么是 CORS CORS&#xff08;Cross-Origin Resource-Sharing&…

联合证券|重磅数据出炉,道指飙涨700点!美股新年首周“开门红”!

美股涨嗨了&#xff01; 当地时间1月6日&#xff0c;最新发布的美国12月非农工作陈述显现&#xff0c;美国工作市场终于呈现降温迹象&#xff0c;过去一年的激进加息成效初显。受此提振&#xff0c;美股三大股指高开高走&#xff0c;彻底改变前几日的跌势。从周k线看&#xff…

PCB结构和谐振(三)

PCB结构和谐振&#xff08;一&#xff09;PCB结构和谐振&#xff08;二&#xff09;仿真研究在本节中&#xff0c;我们首先对玻璃束的随机分布进行了简单的模拟研究。然后我们利用这些实验结论来简化常用的玻璃布3D结构。最后&#xff0c;这种简化的结构用于研究复杂层压板和两…

Java设计模式中原型模式是啥/浅克隆与深克隆又是什么/clone方法怎么回事

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4.5 原型模式 4.5.1 概述 用已创建实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象一样的新对象 4.5.2 结构 抽象原型类&#xff1a;规定具体…

Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客https://blognas.hwb0307.com&#xff0c;该文的内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 基于《Docker系列 搭建个人云盘服务nextcloud》&#xff0c;相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是&#xff0c;Ne…

02、做点准备工作 osg\openscenegraph源代码下载 C++三维视频融合实战系列(时空克隆)

首先&#xff0c;要有一点C编程基础&#xff0c;熟悉VS2013开发环境。 在开始实践之前&#xff0c;先要搭建号VS2013开发环境。 然后&#xff0c;建议电脑安装windows 10 64位操作系统。 接下来需要在以下地址下载开源代码&#xff1a; 1、osg下载 打开openscenegraph主页…

CSS权威指南(七)视觉格式化

文章目录1.盒模型2.元素的显示方式3.行内元素1.盒模型 不管是什么元素,CSS都假定每个元素会生成一个或多个矩形框,我们称之为元素。各元素框的中心是内容区域&#xff0c;四周有可选的内边距、边框、轮廓和外边距。默认情况下&#xff0c;内容区的背景出现在内边距范围内。外边…

5分钟搞懂用户态,内核态

5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间&#xff0c;为了使应用程序访问到内核管理的资源例如CPU&#xff0c;内存&#xff0c;I/O。内核必须提供一组通用的访问接口&#xff0c;这些接口就叫系统调用。 用户态&#xff0c;内核态…

进制详解:二进制、八进制和十六进制

进制详解&#xff1a;二进制、八进制和十六进制 背景&#xff08;Contexts&#xff09; 我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;…

机器学习笔记之深度信念网络(一)背景介绍与模型表示

机器学习笔记之深度信念网络——背景介绍与模型表示引言深度信念网络场景构建深度信念网络的联合概率分布引言 从本节开始&#xff0c;将介绍深度信念网络。 深度信念网络 深度信念网络(Deep Belief Network,DBN)是杰弗里辛顿(Geoffrey Hinton)于2006年提出的模型&#xff0…

Day853.WorkerThread模式 -Java 性能调优实战

WorkerThread模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于WorkerThread模式的内容。 Thread-Per-Message 模式&#xff0c;对应到现实世界&#xff0c;其实就是委托代办。这种分工模式如果用 Java Thread 实现&#xff0c;频繁地创建、销毁线程非常影响性能…

场景编程集锦 - 吉米的总统梦想

1. 场景描述 吉米是太平洋岛国一个贫苦家庭的孩子&#xff0c;他的梦想就是当总统&#xff0c;引领国家走向富强之路。 开学的第一堂课上&#xff0c;老师用白色的粉笔在黑板上写下了“我的梦想”&#xff0c;同学们都陷入了思考。大卫的梦想是当一名科学家&#xff0c;用奇思妙…

CSS初级教程(文本)【第六天】

文章目录【1】CSS 文本[字体颜色|背景色]【2】CSS 文本对齐【3】CSS 文字装饰【4】CSS 文本转换[大写或小写]【5】CSS 文字间距【6】CSS 文本阴影【7】所有 CSS 文本属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CS…

Windows访问控制 -- SID

Windows访问控制是一个比较大的题目&#xff0c;因此计划用一系列的文章简单谈一下这个。本篇是开篇&#xff0c;介绍SID。 Windows访问控制定义 Windows访问控制的含义可以参考MSDN的描述&#xff1a;Access control refers to security features that control who can acce…