首页 > 其他分享 >对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例模式+关联数组的初始化+VIM的正则表达式+grep的或操作+uvm event的电平触发+二维

对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例模式+关联数组的初始化+VIM的正则表达式+grep的或操作+uvm event的电平触发+二维

时间:2024-10-08 21:11:50浏览次数:1  
标签:begin end 打印信息 process 低功耗 display uvm my event

对UVM添加超时前的打印信息

首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。
$time < set_time,则进行循环。

uvm_cmdline_processor clp;
clp = uvm_cmdline_processor::get_inst();
string timeout_settings[$];
string timeout;
time timeout_int;
string override_spec;
clp.get_arg_values("+UVM_TIMEOUT=", timeout_settings);

timeout = timeout_settings[0];
void'($sscanf(timeout,"%d,%s",timeout_int,override_spec));

AXI低功耗接口

AXI低功耗接口_csysreq-CSDN博客

CSYSREQ
系统时钟控制器通过拉低 CSYSREQ 来请求设备进入低功耗状态;
系统时钟控制器通过拉高 CSYSREQ 来请求设备退出低功耗状态。

CSYSACK
设备通过拉低 CSYSACK 来响应系统时钟控制器请求进入低功耗状态的请求;
设备通过拉高 CSYSACK 来响应系统时钟控制器请求退出低功耗状态的请求。

CACTIVATE
CACTIVATE 用于指示设备是否需要时钟信号。

process的await语句

手册语句

task do_n_way( int N );
  process job[1:N]; 
  for ( int j = 1; j <= N; j++ )
    fork
      automatic int k = j; 
      begin job[k] = process::self(); ... ; end
    join_none
    // wait for all processes to start
    for( int j = 1; j <= N; j++ ) 
      wait( job[j] != null );
    job[1].await(); // wait for first process to finish
    for ( int k = 1; k <= N; k++ ) begin
      if ( job[k].status != process::FINISHED )
        job[k].kill();
    end
endtask

对象当成参数

传递的内容为对象,不管是output,还是task、function,其都转换为了ref类型。

class MyClass;
    int value;
endclass

module test;

    // Task that takes a class object by reference
    task modify_class(output MyClass obj);
        obj.value = 42;
    endtask

    initial begin
        MyClass my_obj = new();
        my_obj.value = 10;
        
        $display("Before modify: %0d", my_obj.value);
        
        // Call the task, passing the object by reference
        modify_class(my_obj);
        
        $display("After modify: %0d", my_obj.value);
    end
endmodule

sv的单例模式

使用protected类型,禁止使用new方法,随后定义一个新的类似new的方法,在每次使用实例之前调用。
在实际用的时候,虽然不可以使用静态的class,但是可以使用静态的方法和变量,因此可以通过定义静态的方法,实现直接调用。
使用class_inst::function_name()调用函数,使用class_inst::value_name = x;赋值变量。

class Singleton;
    // 单例的静态变量
    static Singleton instance;

    // 私有的构造函数
    protected function new();
        $display("Singleton instance created.");
    endfunction

    // 获取单例实例的方法
    static function Singleton getInstance();
        if (instance == null) begin
            instance = new();
        end
        return instance;
    endfunction

    // 示例方法
    function void display();
        $display("This is the singleton instance.");
    endfunction
endclass

module testbench;
    initial begin
        // 获取单例实例
        Singleton s1;
        Singleton s2;
      
        s1 = Singleton::getInstance();
        s1.display();

        // 尝试获取另一个实例

        s2 = Singleton::getInstance();
        s2.display();

        // 比较两个实例的地址
        if (s1 == s2) begin
            $display("s1 and s2 are the same instance.");
        end
        else begin
            $display("s1 and s2 are different instances.");
        end
    end
endmodule

关联数组的初始化、元素查找、索引打印

初始化过程和队列不同,队列初始化使用{},等同于即delete();而关联数组使用'{}

program test_find;
  int arr[int];
  int result[$];
  int idx;

  // 查找所有大于5的元素
  

  initial begin
    int i;
    // 初始化
    arr = '{};
    for(i=3;i<10;i++) begin
      arr[i] = i+10;
    end
    result = arr.find_index() with (item > 14);
    $display("Elements greater than : %p", result);
    
    // 使用 first() 获取第一个索引
    if (arr.first(idx)) begin
      // 遍历并打印所有索引
      do begin
        $display("Index: %d, Value: %0d", idx, arr[idx]);
      end while (arr.next(idx)); // 使用 next() 获取下一个索引
    end
    $display("Elements: %p", idx); 
  end

endprogram

vim正则表达式和普通表达式

不同的地方在于vim的正则需要额外加上斜杠转义
https://blog.csdn.net/gsjthxy/article/details/99696704

#元字符 说明
*      #匹配0-任意个
\+     #匹配1-任意个
\?     #匹配0-1个
\{n,m} #匹配n-m个
\{n}   #匹配n个
\{n,}  #匹配n-任意个
\{,m}  #匹配0-m个
\_.    #匹配包含换行在内的所有字符
\{-}   #表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
\=     #匹配一个可有可无的项
\_s    #匹配空格或断行
\_[]
 
#元字符 说明
\*     #匹配 * 字符。
\.     #匹配 . 字符。
\/     #匹配 / 字符。
\\     #匹配 \ 字符。
\[     #匹配 [ 字符。

grep的或操作

使用正则表达式即可,正则表达式中的|表示或的意思
https://blog.csdn.net/stalin_/article/details/81450633

grep 'pattern1\|pattern2' filename
grep -E 'pattern1|pattern2' filename

uvm event的电平触发

https://blog.csdn.net/hh199203/article/details/127652972
使用trigger和wait_trigger实现脉冲的触发和等待
使用trigger+reset和wait_on+wait_off实现电平的触发和等待,trigger函数一方面会形成脉冲,另一方面也会将状态转换为on。

module testbench();
  class my_test extends uvm_test;
    `uvm_component_utils(my_test)
    
    uvm_event my_event;
    
    function new(string name = "my_test", uvm_component parent = null);
      super.new(name, parent);
      my_event = uvm_event_pool::get_global("my_event");
    endfunction
    
    task run_phase(uvm_phase phase);
      phase.raise_objection(this);
      // Fork a process to trigger the event after some time
      fork begin
        #10ns;
        my_event.trigger();
        #5ns;
        my_event.reset();
      end join_none
      
      // Wait on the event
      uvm_report_info("WAIT_ON", "Waiting for the event to trigger", UVM_LOW);
      my_event.wait_on();
      uvm_report_info("WAIT_ON", "Event has been triggered", UVM_LOW);
      #10ns;
      my_event.wait_off();
      uvm_report_info("WAIT_OFF", "Event has been off triggered", UVM_LOW);
      phase.drop_objection(this);
    endtask
  endclass
  
  initial begin
    run_test("my_test");
  end
  
endmodule

二维队列降维到平铺状态

module two_dim_queue_flatten_stream;
  bit[31:0] d_queue[$][$] = '{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
  bit [511:0] flattened_queue;

  initial begin
    // 打印二维队列
    $display("Original 2D Queue:");
    for (int i = 0; i < d_queue.size(); i++) begin
      $display("%p", d_queue[i]);
    end

    // 使用流操作降维
    flattened_queue = {>> {d_queue}};

    // 打印降维后的队列
    $display("Flattened Queue:");
    $display("%0h", flattened_queue);
  end

endmodule

输出

Original 2D Queue:
'{'h1, 'h2, 'h3} 
'{'h4, 'h5, 'h6} 
'{'h7, 'h8, 'h9} 
Flattened Queue:
1000000020000000300000004000000050000000600000007000000080000000900000000000000000000000000000000000000000000000000000000

标签:begin,end,打印信息,process,低功耗,display,uvm,my,event
From: https://www.cnblogs.com/bai2022/p/18450906

相关文章

  • 深入解析Android STR待机:低功耗,快速唤醒的奥秘
    目录一、STR简介二、STR技术的主要特点2.1.低功耗2.2.快速唤醒2.3.用户体验三、实现原理3.1.电源管理3.2.数据保存3.3.硬件支持3.4.唤醒机制3.5.运行时权限管理3.6.低功耗技术四、待机流程步骤4.1.注册广播接收器4.2.监听屏幕关闭事件4.3.执行待机......
  • Python 并发新境界:探索 `multiprocessing` 模块的无限可能
    引言随着硬件技术的发展,多核处理器已经成为标准配置。这意味着我们的计算机拥有执行多个任务的能力。然而,默认情况下,Python程序由于全局解释器锁(GIL)的存在,并不能充分利用这些核心资源。这就引出了multiprocessing模块的重要性——它通过创建独立进程来绕过GIL限制,从而实现真正的并......
  • Hard Process
    HardProcess(题面)大意:给定一个长度为\(n(0<=n<=10^5)\)的序列,序列中只包含0或1,现有k次机会可以将0改为1,问,k次机会前最长连续1序列的长度并且输出这个序列(只需一个)。解法:二分答案+前缀和证二分答案的单调性:先解释check函数:现有一个需要查询的长度len,从1开始直到n,遍历每一个长......
  • HS6621Cx 一款低功耗蓝牙SoC芯片 应用于键盘、鼠标和遥控器消费类产品动能世纪
    HS6621Cx是一款功耗优化的真正片上系统(SOC)解决方案,适用于低功耗蓝牙和专有2.4GHz应用。它集成了高性能、低功耗射频收发器,具有蓝牙基带和丰富的外设IO扩展。HS6621Cx还集成了电源管理功能,可提供高效的电源管理。它面向2.4GHz蓝牙低功耗系统、专有2.4GHz系统、人机接口设备(键盘......
  • 触摸芯片SI314替代 GTX314L—低功耗14通道电容触摸传感器芯片 应用智能门锁动能世纪
    1.介绍Si314是一款具有自动灵敏度校准功能的14通道电容传感器,其工作电压范围为1.8~5.5v.Si314设置休眠模式来节省功耗,此时,功耗电流为[email protected]。Si314各个感应通道可实现独立使能、校准、灵敏度调节,可以确保可靠性,且具有自适应滤波功能,以应对各种噪音和环境变化。I2C串行接口可......
  • 低功耗蓝牙芯片的 ESL电子价签解决方案--OM6626/PHY6222动能世纪
    在竞争激烈的零售行业,效率和顾客体验至关重要。传统的纸质价签在更新频率、准确性和管理成本上存在诸多不足。而电子价签(ESL,ElectronicShelfLabel)作为一种智能化解决方案,正在逐渐取代传统价签,帮助零售商提高运营效率和顾客满意度。 01电子价签的优势电子价签通过无线技术实......
  • 【0335】Postgres内核之 auxiliary process(辅助进程)获取 PGPROC latch 所有权 (3)
    1.获取PGPROClatch所有权在【0333】Postgres内核之auxiliaryprocess(辅助进程)创建PGPROC一文中讲解了Auxiliaryprocess获取PGPROC的底层实现过程。在此基础上,本文将基于Postgres内核讲解获取该辅助进程latch所有权的源码实现。1.1latch关联PGPROC获取P......
  • 【0333】Postgres内核之 auxiliary process(辅助进程)创建 PGPROC
    1.auxiliaryprocess当我们是辅助进程(auxiliaryprocess)时,不会进行完整的InitPostgres初始化操作,但即使在辅助进程中,也有几件事需要被启动。这里第一件就是“创建一个PGPROC,以便我们能够使用LWLocks。在EXEC_BACKEND情形下,这一操作已由SubPostmasterMain()完......
  • ESP32系列ESP32-D0WD双模 超低功耗集成BLE4.2+2.4G WIFI SoC芯片
    ESP32系列ESP32-D0WD双模超低功耗集成BLE4.2+2.4GWIFISoC芯片ESP32系列的ESP32-D0WD-V3芯片具有可扩展、自适应等特点。是2.4GHzWi-Fi+蓝牙双核芯片,具有卓越的射频性能,能在-40°C~105°C工作范围内,保持-97dBm接收灵敏度的领先性能。Wi-Fi输出功率在19.5dBm时,能符合SR......
  • IN612L 超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编
    IN612L超低功耗的射频和系统设计、多模式协作协议栈(蓝牙5和软件无线电)以及简易的编程工具支持。主要特性•多模协同通信协议栈低功耗蓝牙5.0完全符合低功耗蓝牙5规格高数据速率支持最高2Mbps远距离支持(125Kbps/500Kbps)。扩展广播模式支持SDR(软件定义无线电,用户......