在ral文件中,我有如下内容:
class ral_reg_AAA_0 extends uvm_reg;
rand uvm_reg_field R2Y;
constraint R2Y_default {
}
function new(string name = "AAA_0");
super.new(name, 32,build_coverage(UVM_NO_COVERAGE));
endfunction: new
virtual function void build();
我在uvm\u agent中实现了一个从机模型。我所说的“从”是指它不能自己启动事务。事务始终由另一方(主DUT)发起。因此,它是一种被动代理(尽管它仍然能够传输回复数据包)。
当从机检测到来自DUT的数据包时,它将自动响应/回复(基于其协议)另一个数据包。
从机代理有一个监听DUT发起传输的监视器。由于它能够传输数据包,从属代理也有一个驱动程序来发送应答数据包
+------------+ master initiate transfer +------------------------
我有一个包含多行的文件,其结构如下
r、 ACFE13D500000000
w、 FE1234AC,00000000
中间值是hexa-address,最后一个值应该是长度为32位(也是hexa)的数据
读取此类文件并将值输入以下事务原型的简单方法是什么:
direction_enum rw; // where- typedef enum { READ = 0, WRITE = 1 } direction_enum;
我有两个文件sequence_item.sv和sequencer.sv,分别包含以下内容。我无法编译sequencer.sv,出现错误
** Error: /afs/asu.edu/users/s/m/u/smukerji/UVM_practice/sequencer.sv(6): (vlog-2730) Undefined variable: 'Packet'.
也许这是一个简单的错误。我的两个班是
//Sequence item
import uvm_pkg::*;
`include "u
我尝试使用Synopsys VCS运行此代码。它在句柄声明后的对象创建中给出错误。错误如下:
错误-[SE]verilog源后面的语法错误有语法错误:
“class.sv”,20:标记为“=”P=new()
将构造函数放入初始块中。感谢您的及时响应。我真的很感激。我编辑了这个问题@dave_59。请核对问题。非常感谢。输出与显示的代码不匹配。你在期待什么?你的编辑完全改变了问题的意义,因此答案不再是问题的答案,对未来的读者来说也毫无意义。因此,我将它们回滚。如果你还有其他问题,请作为另一个问题提
我正在尝试自学SystemVerilog(我是一名大学生,在我的项目中我一直使用VHDL),我有一个关于数据类型的问题。到目前为止,我想我理解了reg、wire和logic之间的区别和利弊,但我想知道,在这段代码片段中:
module example(
input clk,
input nrst,
input nset,
input up,
input [3:0] preload,
output [3:0] counter
);
输入和输出的默认类型是什么?它是逻辑(因为它是“日常”电路的
在verilog事件队列中,如果信号在NBA区域切换,是否有一个系统verilog结构可以标记错误?
差不多
if($toggled_in_nba(clk))
begin
`uvm_error()
end
语言中没有任何东西。NBA地区没有任何变化,活跃地区的一切都在变化。当活动区域中没有更多事件时,非活动区域中的事件变为活动,可能会安排更多事件。这将以递归方式进行,直到在活动或非活动区域中不再安排任何事件。然后,NBA区域中计划的事件变为活动,并且该循环将继续,直到任何区域中都没有
我在系统verilog中定义了一个接口,并使用bind语句绑定到内部RTL信号。我希望能够通过接口强制内部RTL信号。然而,这会导致RTL信号变为“x”,如果我没有明确强制这些信号,那么绑定到接口似乎具有驱动能力。在这种情况下,我不希望RTL信号在没有任何强迫的情况下变为“x”,不确定我在这里做错了什么
我的代码是这样的,DUT是这样设计的:
interface myInf(
inout RTL_a,
inout RTL_b
);
bind DUT myInf myInf_ins
我计划在我的env中实现多个从属代理和一个主代理
有人能给我举个例子说明如何在UVM中使用此功能,以及如何从测试用例中启动特定从属序列器的项。这是非常典型的。没有细节,总的大纲是:
在构建阶段:
如前所述,创建和配置代理
主设备和从设备将配置为激活状态
从属代理通常是响应DUT刺激的反应性代理,因此在这种情况下,从属驱动程序中的序列项将由DUT启动,因此它们不受直接测试用例控制。您能为问题添加更多上下文吗?
我在尝试修改systemverilog函数中的类队列时遇到问题
代码如下:
module my_module;
class dscr;
logic mode;
function void print_dscr;
$display("mode = %d", this.mode);
endfunction
endclass
dscr a_dscr_q[$];
dscr b_dscr_q[$];
initial begin
descriptor_de
我必须更新包中声明的几个枚举数据类型,我的是一个特殊场景,其中枚举数据类型的大小将随参数值而变化。
我必须使参数值对包可见
我知道包不是可以实例化的组件。因此,我不能直接传递参数
有谁能帮我通过一些调整来完成我的要求吗
PS:该要求与TB相关我们通常对必须参数化的长度类型所做的是使用定义,而不是包参数:
package some_package_pkg;
`ifndef MAX_DATA_WIDTH
`define MAX_DATA_WIDTH 32
typedef [`MAX_D
似乎queue.size也可以写为queue.size,它也可以工作。有什么区别吗
这是否意味着所有函数和任务都可以在没有括号的情况下使用 都是一样的
size是一个了解队列维度的函数。你可以用括号写,也可以不用括号
你可以看到和
如果你有一个没有参数的函数,你可以忽略括号你关于大小函数的例子是否意味着所有函数和任务都可以不带括号使用?如果像大小这样的函数没有参数,你可以忽略括号。请参见此处:@a我不建议使用queue.size,即使标准允许。正如您所看到的,它会导致大小是字段还是函数的混淆。@
Questa模拟的通过/失败测试信息是否记录在.ucdb文件中?如果有,是否有一个vsim命令来提取该信息
coverage attribute -name TESTSTATUS
在uvm1.2库uvm_comparer.svh中添加了两个滤波器位“物理”和“抽象”。有谁能告诉我这些过滤器的正确用法吗 这些是来自Specman->OVM->UVM的字段属性设置,用于控制诸如compare/pack/print等策略类。用户可以自行决定如何使用它们。看
我有一个嵌套接口,类似于伪示例
interface a();
logic a;
endinterface: a
interface B();
logic b;
a A();
alias b = A.a; // THIS throws an error
endinterface: b
我想从接口B
但它不允许我对信号进行alias。还有其他选择吗
有什么建议吗 变量和分层引用不能用于alias语句中
你的选择是:
使用分配b=A.A而不是别名
只需在断言中使用A.A
使用let
systemverilog信号量实际上是半生不熟的
在出现重置的情况下,我找不到任何方法来释放信号量,类似于uvm\u tlm\u fifo的.flush()
也没有方法知道有多少信号量被锁定
在UVM中是否有一些类似于UVM\u event的包装器可用于扩展基本信号量功能
人们建议我使用mailbox/tlm_fifo实现更多功能,但我找不到信号量的替代方法来分配超过1个keyCount
如果有人有任何建议,请告诉我
提前感谢。SystemVerilog的信号量和邮箱是基本的内置类,您可以根据
Quartus返回此错误:“索引x返回聚合值”。
守则:
module splineInterp(x, y);
input real x [64:0][0:4];
output real y;
y = x[1] - x[0];
endmodule
您有一个二维(未打包)实数数组:
input real x [64:0][0:4];
在Verilog中,不为所有未打包维度编制索引是非法的(如果您为其中任何维度编制索引)。添加缺少的assign语句,这仍然是非法的:
assign y = x[1
我想知道是否有一种推荐的或标准的方式,人们在他们的项目中为设计安排接口。我的项目(简化):
我的_pkg.sv中有函数和参数:
`include "my_defines.sv"
package my_pkg;
parameter SETTING1 = 5;
parameter SETTING2 = 6;
typedef logic [SETTING1-1:0] my_type1_t;
typedef logic [SETTING2-1:0] my_type2_t;
fun
我试图写一个断言,只有当信号在“clk”的上升沿上转换时才会触发。我写了下面的代码来测试我的想法
module test();
bit clk, clkb;
int d;
assign clkb = ~clk;
initial begin
clk = 0;
forever #100 clk = ~clk;
end
initial begin
d = 10;
#150 d = 20;
end
sva_d_chgd: assert property (@(posed
我有一个uvm_序列,它将启用位特征随机化。根据此位是否启用,我想启用/禁用记分板。我使用config_db设置变量,使用field_宏自动将其放入记分板
我的问题是,在记分板中,我想用feature_en保护运行阶段的代码。但是,该序列在测试的run_阶段运行,因此记分板的run_阶段首先运行,从而保持feature_en默认值,而不获取序列中设置的值
我尝试使用waitfeature_en!=-1我已经将其设置为int,但我意识到在记分板中不会再次对特征进行采样
有没有办法在记分板中动态更新
我如何为可能有许多重复的转换定义覆盖范围bin?我想做的是这样的:
bins st = (2=> 3[* 1:$] => 2);
当然,这是行不通的。编译这行代码时,模拟器会给出错误消息
编辑:模拟器抱怨$符号,他们不认为它是“无界最大值”。但是,在编写序列时,使用连续重复运算符作为[*1:$]是合法的。我希望SystemVerilog的下一个版本也能使封面组合法
作为一个粗略的解决方法,我用一个大的数字替换了$,因此它对于我的案例来说效果很好
bins st = (2=>
我试图理解为什么在下面的示例中,RNG状态没有得到保留:
module test;
string Seed_s = "0";
int unsigned Seed_i = 0;
initial
begin
process p;
p = process::self();
$display("Process randstate1 = ", p.get_randstate());
Seed_s = p.get_randstate();
$disp
我在序列中使用了uvm\u do\u with宏的内联约束,遇到了一些我不太理解的问题。希望有人能对此有所了解:
假设我的my_seq_项目有两个随机变量-数据和addr
my_sequence.sv
class my_sequence extends uvm_sequence;
// Constructor, .... etc etc
virtual task body();
my_sequence_item tx;
bit [31:0] addr = 'h0101_0101;
SystemVerilog函数能否返回包中定义的类型的值?
在声明函数类型之前,如何导入包?我想您希望返回一个数据类型值,该值是在包中定义的
下面是它的示例代码
package tmp;
typedef bit[1:0] x;
endpackage
import tmp::*;
module tp();
x a;
initial
begin
a = return_x();
$display("a - %p", a);
end
endmodule
fun
我在我的系统Verilog代码中使用以下函数。我想知道是否有一种惯用的方法可以达到同样的效果,也许不需要硬连接宽度。我尝试了流媒体运营商,但无法让他们正常工作。我需要使用未打包的数组。非常感谢
function bit [64:0] cat8 (bit [7:0] a[8]);
return { a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0] };
endfunction;
由于您在concat中反转了数组,因此没有好的方法来表示它。
你有:
引用Ashok Mehta在第42页的《Systemverilog断言和功能覆盖率》一书
@(posedge clk)a |=>!A.
在上面的序列中,让我们假设变量“a”同时更改为“1”
采样边缘时钟变为posedge clk(并假设“a”之前为“0”)
转到“1”)。是否会有一个匹配的先行词“a”?不由于a从“0”变为“1”的时间与时钟变为posedge clk的时间相同,因此时钟采样的“a”的值将为“0”(前置区域),而不是“1”。这不会导致触发属性,因为antecedent的计算结果不是
我不断地遇到这个错误,我尝试了各种方法来修复它,但它对我没有帮助
我希望有人能在这方面帮助我
出现问题的代码段如下所示:
if((HR == AHR) and (MIN == AMIN)) To be exact.
always @ (posedge CLK)
begin
case(state)
NORMAL: begin
DHR <= HR;
DMIN <= MIN;
if(ALON)
begin
有人有办法向工厂注册虚拟类吗?使用object_utils宏将定义type_id::create(…)方法,该方法为非法的虚拟类调用new(…)
当然,类型重写对于在工厂注册的任何虚拟类都是必需的。如果有人对此有一个优雅的解决方案,那就太酷了。不幸的是,如果不重新创建自己的工厂,就无法使用虚拟类在UVM中实现这一点。但是,您可以检测该类的build_phase()以检查该类是否已被重写。无论哪种方式,在运行时之前都无法检查此项。因此,您丢失了虚拟类提供的编译器检查,那么为什么还要麻烦使用它呢。我
我正在尝试这样做:
assert property (@(posedge clk) disable iff (!rst) a[*c] -> $rose(b))
这里的c不是一个“常数”,而是来自寄存器某些位的值。例如:reg[4:0]只写一次。检查的目的是查看b是否仅在a为“c”循环数的高值时才被断言
但是,SVA不接受这样的变量:[*reg[4:0]]。有什么想法吗???引入一个局部变量ctr。在每个posedge上,将创建一个新断言,其中包含一个新实例ctr。将ctr设置为等于reg
在我的序列项中,我有一条总线,它应该包含地址和数据。现在我想随机化地址和数据,然后在总线中连接它们的随机化值。
请帮助理解如何在seqItem类中执行此操作
class seqItem extends uvm_sequence_item;
`uvm_object_param_utils(seqItem)
rand logic [541-1:515] wfifo_addr;
rand logic [512-1:0] wfifo_data;
logic [541-
我试图从函数返回动态数组,
我做了dome的工作,但我不知道如何做到完全动态,
这意味着没有声明“数据”
谢谢你的帮助
module test1();
typedef integer dyn_arr[];
function dyn_arr get_register_name();
int data_len = 3;
get_register_name = new [data_len] ;
get_register_name[0] = 5;
get_regist
我有一个模块(称之为child),它将输入和输出声明为二维数组。我还有一个模块(parent)实例化child。2D阵列在parent中被分解为单个信号
为了正确分配父级和子级之间的输入和输出,我必须颠倒输入和输出之间的连接顺序
请参阅以下代码示例,以更清楚地了解我的意思:
module child (
// Inputs and outputs declared as 2D arrays
input [4:0] my_input[8],
output [4:0] my
我需要帮助为不同的输入输出路径建模具有不同延迟的块
input A;
input [3:0] B, C;
output [3:0] Y;
Y=B xor C如果A=1,则Y=0
当posedge A(上升延迟)和NEGDEDGE A(下降延迟)时,延时分别为10us和5us
和B,C->Y延迟为1us(仅当A=1时适用)
对于我的情况,我可能需要使用过程方式,赋值语句可能不适合。对于不可合成的模型,您可以使用#延迟结构与`时间刻度到模型延迟'相结合。类似于下面的代码
`timescale 1u
我需要在Systemverilog中编写一个单向模拟开关,带有一些延迟和上升和下降时间
input real in;
output real out;
assign #<delay> out = (enable === 1'b1)?in:0.0;
输入实数;
输出真实输出;
分配#out=(enable==1'b1)?in:0.0;
在上述情况下,我看不到任何延迟,并且输出与enable=1的输入完全相同。有没有办法在上面增加延迟和上升/下降时间 除了整数值外,没有定义上升/下降
uvm_config_db的唯一用途是当我们的系统中有多个测试台时?
我很高兴能对这个宏做一些解释。uvm\u config\u db类它不是一个宏,除了多个测试台之外还有很多用途。最常见的是与需要访问虚拟接口的驱动程序和监视器类共享来自顶级测试台模块的数据,如接口实例的位置
它还用于组件和序列之间的数据通信,不仅用于传递值,还用于在设置数据时通知
您当然可以编写一个测试台,而无需使用uvm_config_db或整个uvm。但是,这忽略了在同一测试台中编写测试台以实现可维护性以及与其他测试台的可
给定一个矩阵
logic [0:3] [0:3] matrix =
{4'b 1111,
4'b 1111,
4'b 1111,
4'b 1111
}
在运行时,我将输入(x,y)作为索引。
我希望达到索引(x,y+1),(x,y),(x,y-1)并更改它们
例如,如果我得到(x,y)=(1,2),那么我会得到
{4'b 1111,
4'b 1011,
4'b 1011,
4'b 1011
}
我试着
我有几个关于基于UVM的基本结核病的问题,我正在尝试了解其序列及其工作原理
在响应项中更新bvalid时,驱动程序中始终选择bvalid为0
最近两个事务的两条错误消息(#UVM_error@18:UVM_test_top.axi_agent1.axi_base_seqr1@@axi_base_seq1[UVM_test_top.axi_agent1.axi_base_seqr1.axi_base_seq1]响应队列溢出,响应已丢弃)
这里是EDA操场上编译代码的链接
对我遗漏的东西有什么建议
以下模块尝试以三种不同的方式使用未打包的参数数组
module works
#(parameter int num = 4,
parameter int width = 8,
parameter int bits [num] = '{4, 4})
(output logic [width-1:0] mask [num]);
genvar i;
generate
for(i=0; i<num; ++i) begin
我需要创建一个报告(.txt),并且我希望引用每个测试会话,因此我希望对于每个模拟,我将日期添加到报告的名称中。
如报告_01-19-2017-12:53.txt
到目前为止,我已经能够创建一个包含日期的文件,其中包括:
$system("date > sDate");
或在我的模拟软件上显示:
$system("date");
到目前为止,我的代码如下所示:
string filename;
reg [8*30:1] data; // the date is of 2
在我的项目中,有很多序列是通过虚拟序列来处理的。其中一个序列具有框大小和起始值的尺寸信息。所以我需要将序列发送到记分板。我试过使用UVM端口
按顺序:
uvm_ blocking_put_port#(dimension) put_port;
function new(..);
...
Put_port =new(...);
endfunction
Dimension d;
d.sizex= size_x;
d.sizey=size_y;
.....
Put_port.put(d);
我有一个简单的模块:
module always_comb_error_ex
(
input logic a, b,
output logic y, z
);
// Error (10166): SystemVerilog RTL Coding error at always_comb_error_ex.sv(13): always_comb
// construct does not infer purely combinational logic
// Info (100
两者的区别是什么
uvm_component parent = null
,
及
在构造函数中
function new(string name = " ", uvm_component )
在一个给定的班级里?你能不能也为以上三个方面提供一些例子,并给出解释 这是一个更一般的SystemVerilog问题。声明函数参数默认值允许您在不指定该参数的情况下调用函数。对于很少与默认值不同的参数,这是有意义的。但对于从uvm_组件派生的类,只有一个顶级测试组件具有空父级。所有其他组件都应该提供一
如果我想从显示器上结束模拟(我知道这不是推荐的方法),我该怎么做?
假设我在监视器中得到了以下代码:
Virtual task monitor_run();
fork
forever begin
.....
end
forever begin
.....
end
forever begin
.....
end
join
endtask : monitor_run
每次循环检查DUT的输出是否准时,若不准时,则应停止模拟。
如果出现不匹配(错误)且没有记分牌,此特殊监视器应中断模拟。
好的,我需要帮助。我遇到了有关数组数据事务的问题。请帮助我!
代码如下。
数据包是数据类,有三个队列,R、G、B,在模块“test”中,arith函数返回的_数据是无数据。为什么?
问题:虽然“into-arith”函数,但输出tr_out没有数据
class packet # (int bit_depth =16);//packet class
bit [bit_depth-1:0] R[$];
bit [bit_depth-1:0] G[$];
bit [bit_depth-1
我知道我可以生成一个静态count变量并更新该count变量,然后,在约束中,我可以检查count%5是否为零,然后使b=0,但是有更好的方法吗?谢谢。无需进行静态计数,只需非随机计数即可
class Base
rand bit b;
// constraint c1 { every 5th randomization should have b =0;}
endclass
如果知道b的上限,那么可以编写如下约束
class Base;
rand bit b;
int count;
您将继承(IS-a)与容器(HAS-a)和嵌套声明混合在一起。通过继承,您只需构造扩展类。如果构造基类,则该对象不知道它的任何扩展,包括具有嵌套类声明的类
除非您需要在常规名称空间中隐藏嵌套类类型的名称,否则没有理由使用嵌套类。否则,嵌套类的行为与您在未嵌套的情况下声明它的行为相同。classBBB是派生类和嵌入类。您所说的“child”是指哪一个类?你对b的约束总是会失败。你是说q.randomize()?
class AAA;
rand int a;
rand bit b;
我有一个UVM测试台,用于我芯片中的一个小模块。其中有一个带有驱动程序的代理,该驱动程序在虚拟接口上驱动数据,该虚拟接口如下所示:
interface my_if (input bit clk);
logic [3:0] opcode;
// Clocking block for the driver
clocking drvClk @(posedge clk);
output opcode;
endclocking
// Clocking block for
我试图在SystemVerilog source中声明动态数组,但出现如下错误:
仅在SystemVerilog中允许动态范围
我使用的工具是ModelSim。这段代码如下所示:
module sv1;
reg [7:0] memory []; // 8 bit memory with 16 entries
endmodule
可能的问题是什么?您的代码没有问题。唯一的问题是您使用的模拟器不支持SystemVerilog
您可以在处尝试SystemVerilog代码大多数工具将命令行或
我创建了一个简单的模块,比如添加一些管道延迟。我将数据类型设置为参数,这样它就可以处理复杂的事情,比如结构。我有这样的想法:
module pipe
#(parameter type T = int,
parameter DELAY = 0)
(
input clk,
input T data_in,
output T data_out);
T pipe[DELAY];
always_ff @(posedge clk) begin
我曾多次遇到这种情况
在用户定义的uvm驱动程序中,如果我在run_阶段使用下面的方法,它将失败
task run_phase(uvm_phase phase);
#1; // It fail even if I put something like `uvm_info() instead of "#1".
abc_seq_item m_tx;
...
类似的行为也可能发生在sequence类中
task body();
#1;
ab
1 2 3 4 5 6 ...
下一页 最后一页 共 12 页