system verilog 宏

1、在双引号里面不能直接使用宏;

“`xx_define”:这种是会被视为文本,不会把宏的文本替换过来?

` “`xx_define ` ”:要采用这种形式;(参考黄皮书P30)

1、在引号“”里面使用宏:双引号前面都要加一个 ` 以及宏前面也要加一个`

  2、在define里面使用拼接符``xx``,把xx原样放入该位置;(类似外面输入什么,就在这个位置填什么)

字符串拼接宏

`define   TC_SEQ_NAME(TC,SEQ_NAME)  ``TC``_``SEQ_NAME``_seq

踩坑:

之前遇到一个宏,通过命令行获取参数;

但是因为这个宏没写好,导致使用这个宏的tc一直拿不到命令行参数,导致仿真不符合预期。

开始的错误写法:if里面:xx$plusargs(`"ARGS`=%0d,ARGS);因为从命令行获取参数左边和右边要完全一样,上面这种写法导致右边实际是:ARGS`  多了一个“ ` ”

`define  GET_ARGS(ARGS)\
if($value$plusargs("``ARGS``=%d", ARGS)) begin \
    `uvm_info("get_cmd_config", $sformatf(`"ARGS:%0d`", ARGS), UVM_NONE)\
end

(xx-工程积累) 


比较A和B的宏(from GPT)

下面是一个比较A和B是否相等且判断比较结果的带有参数的宏的例子:

```

`define COMPARE(A, B, result) \ if ((A) == (B)) begin \

result = 1; \

end else begin \

result = 0; \

end

```

在这个例子中,宏名为 `COMPARE` ,宏有三个参数,分别是 `A`、`B` 和 `result`。宏的定义体部分首先计算表达式 `(A) == (B)`,并根据比较结果将 `result` 设为 1 或 0。如果 `A` 和 `B` 相等,则 `result` 被设为 1;如果不相等,则被设为 0。

下面是使用该宏的一个例子:

```systemverilog

module top;

logic [7:0] data1 = 8'hAB;

logic [7:0] data2 = 8'hCD;

logic result;

initial begin

`COMPARE(data1, data2, result)

if (result)   $display("Data1 eq Data2");

else         $display("Data1 ne Data2");

end

endmodule

``` 在这个例子中,宏调用中的 `result` 参数用来存储比较结果。如果 `data1` 和 `data2` 相等,则 `result`会设为 1,表示相等;否则 `result` 被设为 0,表示不相等。在宏调用后,可以通过 `if` 语句对比较结果进行判断并输出结果。


实操:定义在env的pkg里面

用的地方:

 效果:

 因为定义那里的打印直接用了A,导致这里输出了A为10;


可以使用`$display`或者`$write`系统函数在宏定义中打印调试信息。也还可以用uvm_info等。例如: ```

`define MY_MACRO(a, b) \

begin \

$display("a = %d, b = %d", a, b); \

// do something \

end

```


在SystemVerilog中,有很多常用的宏。以下是几个比较常用的宏列表及其用途:

1. `define `ifdef / ifndef 用于判断某个宏是否被定义,可以用来实现条件编译。

2. `define `timescale 用于设置时钟分辨率和精度,可以在仿真中使用。

3. `define `include 用于包含其他文件,可以将多个文件合并在一起。

4. `define `define 用于定义宏,可以简化代码。

5. `define `undef 用于取消某个宏的定义。

6. `define `error 用于在编译时输出错误信息,可以帮助调试代码。

7. `define `line / `file 用于获取当前行号和文件名信息,可以在调试时使用。

8. `define `assert / `assume 用于在仿真中进行断言和假设判断,可以验证设计的正确性。


在SystemVerilog中,宏定义可以包含函数,这些函数也可以帮助简化代码,提高代码的可读性。以下是几个常用的宏定义函数:

1. `define MAX(a, b) ((a) > (b) ? (a) : (b)) 将两个值进行比较,返回较大的值。

2. `define MIN(a, b) ((a) < (b) ? (a) : (b)) 将两个值进行比较,返回较小的值。

3. `define ABS(x)  ((x) >= 0 ? (x) : -(x)) 返回一个数的绝对值。

4. `define ASSIGN(dest, src) { dest = src; } 将源值赋给目的值,可以用于简化赋值语句。

5. `define CONCAT(a, b) {a, b} 将两个值串联起来,返回一个组合类型的值。

6. `define REPEAT(n) for(int i=0; i<(n); i++) 用于在宏定义中定义一个 for 循环,循环次数由 n 指定。

7. `define FOREVER for(;;) 用于在宏定义中定义一个无限循环。

8. `define CASE(x) switch(x) 用于在宏定义中定义一个 switch 语句。

9. `define ENDCASE break; } 用于在宏定义中定义 switch 语句中的结尾 "} "。

10. `define DEFAULT default: 用于在宏定义中定义 switch 语句中的默认情况。


1. `define BITSET(reg, bit) ((reg) |= (1 << (bit))) 用于将寄存器中某个位设置为1。

2. `define BITCLR(reg, bit) ((reg) &= ~(1 << (bit))) 用于将寄存器中某个位设置为0。

3. `define BITTEST(reg, bit) ((reg) & (1 << (bit))) 测试寄存器中某个位的状态,如果为1则返回1,否则返回0。

4. `define ISPOW2(x) (((x) & ((x) - 1)) == 0) 判断一个数是否为2的幂次方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值