C 编程之——寄存器赋值操作

在嵌入式硬件编程中,大多数情况下都是对相应硬件的功能寄存器进行设置和操作。

一, 寄存器的设置和操作特性

1,一个寄存器的每个位有其不同的意义,进行不同的设置会使硬件产生不同的效果和功能;

2,有些情况下需要对一个寄存器进行连续的不同的甚至完全相反的设置;

3,有些情况下需要对一个寄存器中的某一位或一位进行连续的不同的甚至完全相反的设置,而其余的位要保持不变;

4,有时,对一个寄存器进行设置时,对其不同的位进行先后顺序不同的设置,即对其各个位有先后设置的顺序的要求,使硬件产生的结果也不同;

5,有时,对于一个寄存器要求必须一次赋值,若对其某些位赋值先后顺序不同,便达不到预期的效果和功能。

二,寄存器的赋值操作方法

为说明方便,定义如下3个8位的寄存器:

#define   REG     0xFFFFFF10

1,对单个的位进行赋值

(1)    将寄存器REG的第5位置“1”

REG |= (1 << 5);

(2)    将寄存器REG的第5位清零

REG &= ~(1 << 5);

(3)    将寄存器REG的第3、5位置“1”

REG |= (1 << 5) | (1 << 3);

(4)    将寄存器REG的第3、5位清零

REG &= ~( (1 << 5) | (1 << 3) );

2,直接赋值

(1)将寄存器REG的0、1、2、3、5、7位置“1”

REG = 0x5F;

(即给寄存器REG1赋值为0101 1111,这种方法多在初始化中使用)

(2)分别将寄存器REG的1、3、5、7位置“1”,0、2位置“0”

uint32 temp;

tmep = REG;

temp &= ~0x01;

temp |= (1 << 1); 

temp &= ~(1 << 2);

temp |= (1 << 3);

temp |= (1 << 5);

temp |= (1 << 7);

REG = temp;

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
UVM提供了uvm_reg_backdoor类,用于在测试中访问寄存器的内部实现。这个类可以让我们在测试中使用不同的方式来访问寄存器,以验证寄存器的功能和性能。 uvm_reg_backdoor类主要有两个方法: - `void read(uvm_reg_item rw)`:读取寄存器的值,将结果存储在rw.value中。 - `void write(uvm_reg_item rw)`:写入寄存器的值,将值存储在rw.value中。 其中,`uvm_reg_item`是一个包含寄存器地址、写入/读取值等信息的uvm序列化对象。 要使用uvm_reg_backdoor类,我们需要创建一个新类,继承自uvm_reg_backdoor。在新类的构造函数中,我们需要调用基类的构造函数,并通过该函数将要访问的寄存器作为参数传递。 下面是一个使用uvm_reg_backdoor类的示例: ```systemverilog class my_reg_backdoor extends uvm_reg_backdoor; `uvm_object_utils(my_reg_backdoor) function new(string name = "my_reg_backdoor"); super.new(name); endfunction virtual function void read(uvm_reg_item rw); // 从寄存器中读取值 endfunction virtual function void write(uvm_reg_item rw); // 将值写入寄存器 endfunction endclass ``` 在测试中,我们可以使用uvm_reg_backdoor类的实例来访问寄存器。例如: ```systemverilog my_reg_backdoor my_bd = new; uvm_reg_item rw = new; rw.element = my_reg; rw.kind = UVM_REG; rw.path = UVM_FRONTDOOR; rw.offset = 0; rw.value[0] = 0x1234; my_bd.write(rw); // 从寄存器中读取值 my_bd.read(rw); $display("value = %h", rw.value[0]); ``` 使用uvm_reg_backdoor类可以方便地访问寄存器的内部实现,从而进行更全面和深入的验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值