基于System-Verilog的流水灯设计与仿真


一、system Verilog

1.语言基本介绍

像 Verilog 和 VHDL 之类的硬件描述语言 (HDL) 主要用于描述硬件行为,以便将其转换为由组合门电路和时序元件组成的数字块。为了验证 HDL 中的硬件描述正确无误,就需要具有更多功能特性的面向对象的编程语言 (OOP) 来支持复杂的测试过程,这种语言通常被称为硬件验证语言 (HVL)。

SystemVerilog 是 Verilog 的扩展,具有诸多此类验证功能,能支持工程师在仿真中使用复杂的测试激励文件结构和随机激励来验证设计。

相比于 Verilog,SystemVerilog 的主要优势体现在它能够执行受约束的随机激励、在测试激励文件构造中使用 OOP 功能特性、功能覆盖范围、断言等等。

2.过程赋值和连续赋值

在 SystemVerilog 中,有两种赋值方式:过程赋值(Procedural Assignment)和连续赋值(Continuous Assignment)。它们用于在模块中定义信号的行为。

    1.过程赋值(Procedural Assignment): 过程赋值用于在 always 块内或函数、任务中对信号进行赋值。过程赋值使用 = 或 <= 运算符。

使用 = 运算符进行赋值时,表示阻塞赋值。即,在当前语句执行完成之前,不会进行下一条语句的执行。具有以下特点:
块结束后才完成赋值操作。
值并不是立刻就改变的。
这是一种比较常用的赋值方法。(特别在编写可综合模块时)
使用 <= 运算符进行赋值时,表示非阻塞赋值。即,所有的非阻塞赋值语句都会同时执行,并且不会等待其它语句的完成。具有以下特点:
赋值语句执行完后,块才结束。
值在赋值语句执行完后立刻就改变的。
可能会产生意想不到的结果。
注:一般不会将阻塞赋值和非阻塞赋值一起使用。

二、编写testbench仿真

1.流水灯testbench

module led_chaser_tb;
 
// 参数定义LED数量
parameter NUM_LEDS = 8;
// 测试信号
logic [NUM_LEDS-1:0] leds;
// 时钟信号
logic clk;
 
// 生成时钟
always #10 clk = ~clk;
 
// 实例化被测试模块
led_chaser uut (
    .clk(clk),
    .leds(leds)
);
 
// 初始化测试
initial begin
    // 初始化输入和输出
    clk = 0;
    leds = '0;
    // 运行仿真
    #100;
    $finish;
end
// 监视LED状态
always @(posedge clk) begin
    $display("Time: %0t, LED State: %b", $time, leds);
end
endmodule

2.2位全加器

代码如下(示例):

module full_adder(
    input wire a,  // 第一个加数
    input wire b,  // 第二个加数
    input wire cin, // 进位输入
    output wire sum, // 结果
    output wire cout // 进位输出
);
 
    assign sum = a ^ b ^ cin; // 计算结果
    assign cout = (a & b) | (b & cin) | (a & cin); // 计算进位
 
endmodule

3.实验结果

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值