在SystemVerilog中,分层模块可以通过简单数据类型、复杂数据类型(结构、联合等)或接口连接。我感兴趣的特性是将两个模块之间的所有信号聚合在一个地方,这简化了代码的维护
例如,在以下示例中,在不更改m1、m2和top声明的情况下更改s_点的定义:
typedef struct {
logic [7:0] x;
logic [7:0] y;
} s_point; // named structure
module m1 (output s_point outPoint);
/
如何控制某些组件的详细程度,以便仅将详细程度设置为少数组件
比如说,在验证特定功能时,测试涉及的组件/序列/对象/接口等很少。我只想将这些设置为UVM\u HIGH。我不想将全局严重性设置为UVM_HIGH,因为可能会出现大量不相关的调试消息,这可能会增加日志大小
有什么更干净的方法可以做到这一点?可以使用额外的命令行plusarg来触发它。基本上,要求是特定功能验证涉及的测试/组件/序列/对象/接口应采用全局严重性或特定功能严重性,具体取决于哪个更高
请注意,不能使用uvm_组件的内置报告方法
我想将covergroup绑定到interface对象。这就是为什么作为covergroup的输入,我指定接口对象:
interface fifoPorts #(parameter DSIZE = 8);
...
endinterface
covergroup write_cvr (fifoPorts itf) @(posedge itf.wclk);
coverpoint itf.winc iff (!itf.wrst_n);
coverpoint itf.wrst_n {
我想做以下工作:
typedef enum {a, b, c} my_type_e;
typedef enum {receive, transmit} dir_e;
class my_class #(type my_type_e);
my_type_e variable_name;
endclass
但我想让“variable_name”成为一个使用dir_e作为索引的数组。比如说
my_class class_h;
class_h.variable_name[rx] = a;
或
这
我有一笔交易,包括:
string delay;
string delay_type;
如果延迟类型=时间,则延迟将具有以下结构:
3ns数字和时间单位
如果延迟类型==事件,则延迟将具有以下结构:
@posedge clk@信号的posedge/NEDGE
我如何在bfm中使用此功能
例如,在delay_type==time的情况下,我希望能够做到:
3ns,其中3ns是延迟字符串
在delay_type==event的情况下,我希望能够等待事件,例如等待某个信号的posedge。不能将字符
我有以下属性声明并签入我的一个系统verilog文件:
property StepOutP_pulse_width;
int count;
@(posedge ClkRs_ix.clk)
($rose(mc.outvec.StepOutP_o),count=STEPPER_PULSE_WIDTH) |->
(mc.outvec.StepOutP_o,count--)[*] ##1 (~mc.outvec.StepOutP_o &&a
现在,我尝试在多系统值任务中获取随机值。
所以我只是按照下面的方法实现
module testa;
task sendtransfer1
foreach (burst3.Data[ii1])
burst1.data[ii1] = $urandom_range (967295,0);
end task
task sendtransfer2
foreach (burst3.Data[ii2])
burst2.data[ii2] = $urandom_range (967295,0);
e
实际上,我的任务是读取寄存器:
task read_reg(bit[31:0] reg_addr,bit [0:31] rd_beat...);
如您所见,第一个输入参数是32位寄存器的地址。寄存器地址通过以下参数定义:
parameter int REG_0 = 32'h80440050; //R
因此,当调用任务读取寄存器时,可以将参数传递给任务:
read_reg(REG_0,….);
阅读例如REG_0
现在,这是我想进一步参数化的任务调用,因此我不想硬编码参数名REG_0,但我想
在我的验证环境中,我为可重用性设置了一些常见序列:
class common_sequence(type T = uvm_sequence) extends uvm_sequence#(uvm_sequence_item);
`uvm_object_param_utils(common_sequence_t#(T))
function new(string name="common_sequence");
super.new(name)
我正在尝试使用脚本运行几个测试用例。但在运行第一个测试用例后,我收到一条错误消息。这将停止模拟。我正在将日志与此邮件一起附加。我不明白为什么会发生这种情况
我查看了以前的帖子,并在vsim命令中添加了+UVM_objective_TRACE。但我无法找出错误的原因。有人能帮我吗
# UVM_INFO @ 0: run [OBJTN_TRC] Object uvm_test_top raised 1 objection(s): count=1 total=1
# UVM_INFO @ 0: ru
我一直面临着一个关于启动项目的问题。每次它到达开始项目,我的整个测试都会挂起,我无法找出问题所在。任何指点都将不胜感激
下面是代码的样子:
task good_bad_seq_0_task ();
RX_eth10g req;
RX_eth10g rsp;
RX_eth10g_knobs t;
int good_bad_seq_count;
//'Vy_good_bad_long_seq' is a loop Variable
int Vy_good_bad_long_s
我是Verilog用户,所以我不熟悉SystemVerilog
现在我正在努力学习
使用结构的优点是什么?SystemVerilog中的结构或多或少类似于C语言中的结构用法,结构是在单个名称下的不同数据类型、变量或常量的集合。有关更多详细信息,请始终参考SystemVerilog LRM♦ 7.2结构
我将在这里解释结构更常见的用法和优点
结构声明可以通过变量或网络完成,结构作为一个整体可以通过使用var关键字声明为变量,结构可以使用Verilog数据类型wire或tri定义为网络,当定义为网络
标签: System Verilog
verificationunary-operatorbitwise-orregister-transfer-level
在系统verilog中,总线或信号是否有减少位的限制
我想在下面的节点中检测到至少一个“1”,并且我正在使用一个“或”操作符,但是,在某些情况下它不能正常工作。这是我在模拟中看到的行为:
|000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0010=1
|000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001=1
|10
对象C下有一个任务T,对象B和C在对象a下处于同一级别。当超时时,对象B如何调用对象C下的任务T?
提前感谢。
无法在其作用域之外访问普通方法
但是,如果您在中定义了静态方法,比如类C。要在类B中访问此方法,请使用范围解析“:“具有类名的运算符”
例如,访问从C类到B类的静态“显示”方法
class B;
function void display();
C::display();
endfunction
endclass
您需要用一些示例代码来说明B和C的类型。您还需要
我有以下接口:
interface tx_in_interface (input bit clk, input bit tx_srstn);
//dut input
logic [15:0] xi;
logic [15:0] xq;
logic [15:0] sin;
logic [15:0] cos;
int chind2;
endinterface
interface tx_out_interface (input bit
假设我有一个压缩结构:
typedef struct packed {
logic a;
logic [7:0] b;
bit [7:0] c;
logic [7:0] [31:0] d;
} my_struct;
我想把它传递到一个C函数中:
import "DPI" context function int my_dpi_function (input my_struct data);
如何读取C端的值
int my_dpi_function (void* da
我目前正在使用modelsim SE 5.8e。它不支持SystemVerilog。我需要使用SystemVerilog来设计和验证我的项目。知道哪个版本的Modelsim同时支持sytemverilog的设计和验证子集吗?我以前使用过VCS,并试图找到是否可以使用Modelsim而不是VCS进行模拟
提前谢谢 您使用的是学生版,请尝试其中一种
我想没有开源的模拟器,如果你发现了什么,请告诉我们
其他选项您也可以使用诸如签出之类的其他功能。根据,ModelSim支持SystemVerilog设计
我试图理解在断言中何时使用$rose作为信号。例如,下面的两个断言在哪些方面表现不同
first:assert property
(@(posedge clk) $rose(reset) |-> (data == 0));
second: assert property
(@(posedge clk) reset |-> (data==0));
是不是要将$rose与异步信号一起使用?$rose表示在上一个时钟周期中,信号为“0”,而在当前时
是否可以使用字符串作为SystemVerilog接口参数。我有4个相同接口的实例,我想知道是否可以为每个实例包含不同的断言文件
我的界面如下所示:
interface dai_if #(P_WD_DATA = 24,
string P_FILE_NAME = "assertion_file_name")();
//Internal Signal Defined Here
`include "assertion_file_name"
我是systemverilog的新手,正在尝试构建systemverilog测试台。
我有一个DUT,应该通过多路复用器连接到两个外部模块之一。我想在模拟过程中切换连接,我想使用systemverilog接口连接DUT和多路复用器,以及多路复用器和两个外部模块之间的连接。接口中的信号是双向的
我在写多路复用器时遇到了麻烦。对于当前的实现,我得到一个错误,表达式的LHS不能是导线。如果我将接口中的类型更改为logic,我会得到一个错误,即双向信号不可能实现这一点。
我试着用谷歌搜索,但没有找到任何
我正在使用fgetc读取一个文件。文件读取从一个偏移量开始。在末尾,我看到文件末尾追加了8'hFF。我希望文件中有6个字节,但看到7个字节。我不确定为什么会发生这种情况。有什么想法吗
下面是我的代码:
module file_read();
integer fd,fd1,file_char,status;
logic [7:0] captured_data;
initial begin
fd = $fopen("input_file", "rb");
be_nl_i和xbc_i是接口模块。编译带有实例名称列表的代码示例A
例A
be_nl_i be_nl0 (), be_nl1 ();
但是,具有另一个接口数据类型的示例B不会编译
例B
xbc_i #(.NUM(3)) xbc0 (clk), #(.NUM(3)) xbc0_d1 (clk), #(.NUM(3)) xbc0_d2 (clk);
是否有合适的语法来编译示例B?模块的参数重写不是特定于实例的
xbc_i #(.NUM(3)) xbc0 (clk), xbc0_d1 (clk
下面是随机重置的基本序列类:
class random_reset;
rand int rst_period;
constraint rst_range { rst_period inside {[1:100]}; }
task random_system_reset (
ref reg rst,
ref reg clk);
begin
rst = 1;
repeat (r
我试图理解以下使用邮箱的FIFO代码。我可以理解其中的大部分内容,但是void'(FIFO.tryput(write_data));//非阻塞写入和void'(FIFO.tryget(读取数据));//非阻塞读取
-“无效”的目的是什么?我知道什么是void,但是void和void'在程序中是相同的吗
interface fifo_channel_1 #(parameter FifoSize = 8, PtrSize = 4,
parameter type DataType = uniType)
我有一个UVM验证环境
在我的测试序列中,在收到中断时,我通过前门(串行事务)从REGA读取(镜像)
在我的记分板中,我使用了.predict方法来更新REGA的预期值
但是,我有以下错误:
Register "regmodel.REGA" value read from DUT (0x00000000000000AA) does not match mirrored value (0x0000000000000000)
从DUT读取的值是正确的(AA),若我打印预测方法中使用的值,那个么它也
以下陈述之间的细微差别是什么
a->bvsa##0 b
在SVA(SystemVerilog断言)中,首先要检查的是单个蕴涵运算符的语法,即a |->b
在SystemVerilog断言中有两个表达式
a##0b
a |->b
实际上,它在表达式上看起来很相似。此表达式的第一个步骤是检查a是否被断言(1),以及0个时钟周期后b是否被断言(1)。第二个表达式是在断言a时检查b是否(打开)断言(1),然后在同一posedge上断言b是否(1)
现在,实际上,当验证工程师编写这种断言时,他们会考虑以下
我试图创建一个任务,负责设置一个向量位,并在一个时钟周期后清除它。我的驾驶员代码附在下面:
class my_if_driver extends uvm_driver;
`uvm_component_utils(my_if_driver)
// Members
// UVM stuff
virtual my_if_interface vif;
function new(string name="my_if_driver", uvm_componen
我遇到了一些代码,它们的功能如下:
`include "./some_path/some_file.svh"
这是否等于:
`include "some_path/some_file.svh"
?
LRM声明,相对路径被视为从编译器的当前工作目录或用户指定的位置开始,因此我希望“.”可以替换这些路径中的任何一个
我猜其目的是指定一个与包含文件的位置相关的路径,而有些人并不真正理解他们在做什么。这将取决于操作系统,而不是SystemVerilog LRM的一部分。../通常意味着只搜索当前工作
我用的是Verilog系统。我的顶层设计文件有一个1位输出bsOut。我还使用了一个名为shift_reg的寄存器,它从端口dOut输出一个8位数字。我想这样做:
module FinalTop (
input clk,
output bsOut
);
Shift_Reg shift_reg(.clk(clk), .dOut(bsOut));
我相信Vivado/Basys3将只使用LSB->bsOut来截断dOut,但是如果我想指定一个不同的位呢?例如,如果我想发送.
我有一些简化的测试结构。testcaseapb\u write\u verify2y\u test调用apb\u write\u verify2y\u seq,然后调用apb\u write\u seq
但是,m_seq.m_addr=16'h0010(在apb_write_verify2y_test)未按其应传给m_apb_write_seq.m_addr
如果我更改apb\u write\u verify2y\u seq中的行,如下所示,则该行正常工作:
assert(m_apb_write
假设我只有一个接口和序列项的多个定义:
class link_pkt extends uvm_sequence_item;
class phy_pkt extends uvm_sequence_item;
在测试期间,这些项目可以通过该接口动态传输出去
实现驱动程序/定序器的正确方法是什么?一个司机够了吗?或者需要一个以上的驱动程序
似乎由于序列项的多个定义,我需要不止一个驱动程序和序列器。但这并不好,因为我无法控制/仲裁传输
有类似的情况,这是一种静态-我们不能切换驱动器的飞行。我需要的是
请帮助找到一个解决方案,有好看的代码
因此,在我的代码中,我必须做几次强制,因为同一根电线是由tb和设计的其他部分驱动的。因此,我有很多类似这样的力陈述:
force TOP.u_proto_mc_TOP.gtx_rx_reset=TOP.u_proto_mc_TOP.u_gtx_RXB.gtxMaster_itf_inst.rstn
force TOP.u_proto_mc_TOP.gtx_tx_reset=TOP.u_proto_mc_TOP.u_gtx_RXB.gtxMaster_itf_
我在C/C++中实现了一个特定的过滤器,“封装”在SystemC模块中。我想在基于SystemVerilog的实际验证环境(VE)中使用此过滤器。为了将数据从过滤器和传输到过滤器,我想实现一个TLM连接。对于TLM,有一种称为“通用有效负载”的东西,基本上定义了可以通过TLM传输的内容,即字节数组
typedef union packed {
real value;
byte unsigned array[8];
} real_u;
因此,我需要将VE中的数据样本从数据类型real转换
有没有办法为SystemVerilog原语添加断言,或者只在封装原语的模块(单元格)中添加断言?简单地添加断言不会编译
primitive mux (q, d0, d1, s);
output q;
input s, d0, d1;
table
// d0 d1 s : q
0 ? 0 : 0 ;
1 ? 0 : 1 ;
? 0 1 : 0 ;
? 1 1 :
在这里,我试图写一个覆盖点来检查信号a打开后是否有信号b(打开)
我相信当两个信号都打开时,上述覆盖点会检查。我不确定我们到底是如何编写我提到的场景的。任何帮助都将不胜感激。另外,如果您知道如何学习system Verilog,请帮助我获取最佳资源。cover指令使用时间序列比使用covergroup要好得多,但这需要采样时钟:
check: cover property (@(posedge clk) a |-> ##[*] b; );
check: cover property (@
我有专用的测试台模块,用于打印/跟踪测试台中DUT的相关信息。我希望避免将所有感兴趣的(内部)信号连接到tb模块
例如,假设我的DUT中有一个内部信号a。如何在printer.sv中访问它,而不必创建匹配的输入?草图:
/---- TB.sv -----------------------------------------\
| |
| /--dut.sv--\ /--prin
我在某个地方读到过,类对象、动态数组等动态对象不允许非阻塞赋值
我的示例代码是
class dyn_class;
logic a;
function void put();
a <= 1'b1;
endfunction
endclass
module TB();
dyn_class dyn_obj = new();
initial
dyn_obj.put();
endmodule
classdyn\u类;
逻辑a;
函数void put();
a1800
我在学习SystemVerilog。但我不能理解
最后给出了仿真结果
事件在SystemVerilog中如何工作
使现代化
它是如何显示如下内容的
ack event emitted
done event emitted
ack event emitted <== I don't understand here Why does it happens?
done event emitted
我想你可能会对这些事件为什么被多次打印感到困惑?请看第5行:
event done = ac
假设有一个结构声明为:
typedef logic [7:0] Data;
typedef struct packed {
logic valid;
Data data;
} MyStruct;
MyStruct foo [8];
结构的数组声明为:
typedef logic [7:0] Data;
typedef struct packed {
logic valid;
Data data;
} MyStruct;
MyStruct foo [8];
我的问题是,通过多个线程同时采样一个coverpoint(在重写了buit in sample方法之后)是否会产生任何副作用
更详细地,考虑下面的代码:
covergroup p_cg with function sample(bit [1:0] a);
coverpoint a;
endgroup : p_cg
p_cg cg1 = new;
init cg1.sample(0);
init cg1.sample(1);
我的理解是,为了更新coverpoint“a”的covergr
请帮助我了解一些与时间刻度相关的模拟器行为。
这是我的顶级模块:
这是我的模拟脚本:
irun \
…
-timescale 1ns/1ps \
…
当我运行模拟时,我看到clk_62p5时钟周期是16ps而不是16ns。你能解释我为什么有这种行为吗
第二个问题:时间单位、时间精度和时间刻度之间有什么区别?回答第二个问题:
`timescale是一个编译器指令。使用编译器指令可能会导致编译顺序依赖关系,即编译文件的实际顺序所导致的不同行为或问题。假设您有三个文件:
fil
我有一个带有rand数据成员I的类。此类(子类)是类父类的成员,父类也有一个数据成员i。我希望约束子类中I的值与父类中I的值相同。我想做一些类似的事情:
c.randomize with {i==this.i;};
但是this.i似乎没有引用父类的i数据成员。(为什么?)
我可以这样做:
function void f;
int dummy = i;
c.randomize with {i==dummy;};
endfunction
或者这个:
function void f;
静态任务和自动任务之间的区别是什么
program class_ref;
int index,value;
class holding_values;
int ass_array[*];
task assign_value (int value,int index);
ass_array[index] = value;
endtask
function void disp(int index);
$display("%t %M:A
您需要遍历完整的slba_previous[id,i],然后检查id==nsid
>警告为 i+1 条件。使用 .SimultSub(/Case>内置函数)确保存在一个数组条目。设计可能总是有偶数个条目,但它看起来像QuestaSIM的约束求解器更悲观,并且想考虑所有可能性。
class ns_data_struct;
rand bit [63:0] ns_size = 64'h0000_0000_0000_0800;
endclass : ns_data_struct
class co
我希望序列块在执行时显示一些信息
e、 g:
我尝试了此代码,但遇到以下错误:
任务$display在需要函数的地方被调用。
请更正任务调用并重新编译
如何克服这个问题?您可以使用语法(sequence\u expr,sequence\u match\u item)在序列表达式中调用$display,其中sequence\u match\u item可以是运算符赋值、inc\u或dec\u表达式或子例程调用
sequence A;
(a, $display("Signal A asserted
typedef结构定义的Systemverilog网络的常用赋值样式,如
typedef struct {
real V;
real I;
real R;
} SVAstruct;
// resolution function ommitted
nettype SVAstruct SVAnet with res_SVA;
是
因此,网络结构的所有元素的赋值都是同时完成的。像这样的任务
P.R = 100;
给出一个错误。有什么方法可以完成个人作业吗?你不能这样做。创建具有特定数据类型的ne
我没有使用uvm或ovm,因此不能使用他们奇特的报告系统。
我想知道是否有一种简单的方法可以知道某个特定的断言在测试期间被激发了多少次,或者$error被调用了多少次。好的,这就是我的结论,不确定这是否是最好的方法/解决方案,但它是有效的。
我定义了一个systemverilog包,其中包含断言错误计数器,并在每个断言的操作块中递增该计数器。
示例代码如下:
package assertion_error;
int assertion_fails;
endpackage : asserti
我有一个包含事务的文件,每个事务都有它发生的时间。
我想运行SystemVerilog模拟,并按时间“播放”每个事务
但是,我不想实际等待事务之间的时钟周期。
相反,我希望将事务时间(从文件)分配给SystemVerilog模拟时间(分配应在0时间内发生)
这样可以提前系统Verilog模拟时间吗?
如果是的话-如何
文件的简化版本:
TIME (ns) | TRANSACTION DATA
1 | 0x1, 0x2, 0x3
5
我试图编写systemVerilog模拟代码。然而,当我试图向类“trans”写入一些值时,它显示了这个错误。有人知道如何解决这个问题吗
“trans”类已包含在内
task main;
forever begin
transaction trans;
gen2driv.get( trans );
@( posedge vif.clk );
vif.valid <= 1;
在下面的代码段中,$的功能是什么
类名称对象[$]
它会创建无限多的对象吗?它会创建一个类变量队列,但不会创建任何类对象。必须使用另一个包含对象句柄的类变量将已创建的类对象推送到队列中:
className objects[$];
className h;
h = new();
objects.push_back(h);
参见IEEE 1800-2017 LRM第7.10节队列
1 2 3 4 5 6 ...
下一页 最后一页 共 12 页