sed的&操作符+复盘和把经验转化为能力+sed替换关联环境变量+SystemC+C++的struct和class+C语言嵌入多行汇编+Makefile定义命令包+dump fsdb波形

sed命令操作

sed的&操作符

sed一般是按行操作,如果匹配到,那么匹配到的内容被表示为&。
以下是在单行操作中,想要实现在某行数据特定字符前后插入字符的方法。
image
image

sed替换关联环境变量

环境变量参与到变量的替换过程中:
(使用双引号)

CHAR=B
echo -e "A\nBC\nCD" | sed "s/C/$CHAR/g"

如果环境变量中掺杂了斜杠(如路径),则需其它处理(将原来的分割符用@替代即可),否则(包含了斜杠sed: -e expression #1, char xxx: Unknown option to) :

sed 's@xxx@'"$PWD"'@'

sed使用拓展正则进行分组替换

增加 -r

sed  -r -i 's/(PASS_MAX_DAYS)\s+([0-9]+)/\1 90/'  /etc/login.defs

复盘和把经验转化为能力

https://www.163.com/dy/article/GEI2Q9EN05429MRP.html
通过寻找和尝试新的做事方式,你才能提高自己的能力。这需要努力和专注,没有这两种成分,任何技能都很难提高。那怎么改进呢?自我评估,以及反思每次练习结束后的情况,并思考下次改进的方法都是比较有效的方法。任何感觉太容易的事情,可能都是你已经知道如何去做的事情,而且你不太可能从中学到很多东西。
《复盘=把经验转化为能力》
image

SystemC

https://systemc.org/overview/systemc/
划分了不同的功能模块。
其中的事务级建模(TLM)实现了模型的最佳重用和跨不同用例的建模工作。
SystemC Analog/Mixed-Signal (AMS)在设计抽象的更高层次上为嵌入式模拟/混合信号应用的设计和建模提供了独特的功能。
Configuration, Control and Inspection (CCI)用于配置、控制和检查(CCI)的目标是提高模型创建者和工具提供者的效率和ROI。
SystemC Verification(UVM-SystemC, SCV)UVM-SystemC库在SystemC中提供了通用验证方法(UVM)的实现。
UVM-SystemC类库支持为系统级验证和测试开发可伸缩和可重用的验证附属品。
SystemC Verification (SCV)库提供了一组通用的api,这些api被用作验证SystemC活动的基础(在约束条件下生成值、事务记录等)。

sc_bv

https://blog.csdn.net/zgcjaxj/article/details/123768443
sc_bv 是 bit vector的简称,在namespace sc_dt (data types)中定义。sc_bv继承于sc_bv_base,sc_bv_base继承于sc_proxy<sc_bv_base>。sc_bv是一个模板类,定义时需要传入一个int参数,表示位宽。

sc_lv

https://blog.csdn.net/denlee/article/details/5686954
局部变量可以初始化为全'X'或全'Z',如sc_lv<8> temp('X');

C++的struct和class

struct中定义的函数和变量

https://blog.csdn.net/ucasliyang/article/details/52691619
struct中定义的函数和变量都是默认为public的,但class中的则是默认为private。

#include<iostream>
#include<string>
 
struct Person
{
  Person(std::string name);
  std::string greet(std::string other_name);
  std::string m_name;
};
 
Person::Person(std::string name)
{
    m_name = name;
}
 
std::string Person::greet(std::string other_name)
{
    return "Hi " + other_name + ", my name is " + m_name;
}
 
int main()
{
    Person m_person("JANE");
    std::string str = m_person.greet("JOE");
    std::cout<<str<<std::endl;
}

struct构造函数中的冒号

https://www.cnblogs.com/pengyingh/articles/10405173.html
构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。

struct _XXX{

_XXX() : y(0xc0) {}

};

C++ 类可以从多个类继承成员

继承使用冒号,各个基类之间用逗号分隔
https://www.runoob.com/cplusplus/cpp-inheritance.html

#include <iostream>
 
using namespace std;
 
// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};
 
// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};
 
// 派生类
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};
 
int main(void)
{
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
 
   area = Rect.getArea();
   
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;
 
   // 输出总花费
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;
 
   return 0;
}

c++的class之间的相互继承关系

https://c.biancheng.net/view/2269.html

  1. public继承方式
    ● 基类中所有 public 成员在派生类中为 public 属性;
    ● 基类中所有 protected 成员在派生类中为 protected 属性;
    ● 基类中所有 private 成员在派生类中不能使用。

  2. protected继承方式
    ● 基类中的所有 public 成员在派生类中为 protected 属性;
    ● 基类中的所有 protected 成员在派生类中为 protected 属性;
    ● 基类中的所有 private 成员在派生类中不能使用。

  3. private继承方式
    ● 基类中的所有 public 成员在派生类中均为 private 属性;
    ● 基类中的所有 protected 成员在派生类中均为 private 属性;
    ● 基类中的所有 private 成员在派生类中不能使用。

struct和class相互继承时,默认的继承方式

https://codeantenna.com/a/GD0A0GiBeZ
(派生struct则为public。派生class则为private)
基类是struct,派生类也是struct,默认的继承方式是public的;
基类是class,派生类也是class,默认的继承方式是private的。
基类是struct,派生类是class,默认的继承方式是private的
基类是class,派生类是struct,默认的继承方式是public的

C语言嵌入多行汇编

在自旋锁的实现层面,是使用event(类似但是和中断不同的方式),实现cpu进入一个低功耗和被唤醒的方式,实现锁的操作。
https://tinylab.org/arm-wfe/
例子如给上自旋锁:

static inline void arch_spin_lock(arch_spinlock_t *lock)
{
	unsigned long tmp;
	u32 newval;
	arch_spinlock_t lockval;
	prefetchw(&lock->slock);
	__asm__ __volatile__(
"1: ldrex %0, [%3]\n"
" add %1, %0, %4\n"
" strex %2, %1, [%3]\n"
" teq %2, #0\n"
" bne 1b"
	: "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
	: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
	: "cc");
	while (lockval.tickets.next != lockval.tickets.owner) {
		wfe();
		lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
	}
	smp_mb();
}

Makefile定义命令包

https://blog.csdn.net/gsjthxy/article/details/106849165

define run-yacc
  yacc $(firstword $^)
  mv y.tab.c $@
endef
foo.c : foo.y
	$(run-yacc)

dump fsdb波形

编译添加:+vcs+fsdbon
仿真添加: +fsdbfile+signal.fsdb
posted @ 2024-01-21 18:22  大浪淘沙、  阅读(9)  评论(0编辑  收藏  举报