System verilog 连接分层模块:SystemVerilog中的结构与接口

在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); /

System verilog 仅为uvm中的少数/序列/对象/接口设置详细度?

如何控制某些组件的详细程度,以便仅将详细程度设置为少数组件 比如说,在验证特定功能时,测试涉及的组件/序列/对象/接口等很少。我只想将这些设置为UVM\u HIGH。我不想将全局严重性设置为UVM_HIGH,因为可能会出现大量不相关的调试消息,这可能会增加日志大小 有什么更干净的方法可以做到这一点?可以使用额外的命令行plusarg来触发它。基本上,要求是特定功能验证涉及的测试/组件/序列/对象/接口应采用全局严重性或特定功能严重性,具体取决于哪个更高 请注意,不能使用uvm_组件的内置报告方法

System verilog covergroup的接口对象

我想将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 {

System verilog 声明枚举类型的数组

我想做以下工作: 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; 或 这

System verilog SystemVerilog-如何将字符串用作事件或时间?

我有一笔交易,包括: string delay; string delay_type; 如果延迟类型=时间,则延迟将具有以下结构: 3ns数字和时间单位 如果延迟类型==事件,则延迟将具有以下结构: @posedge clk@信号的posedge/NEDGE 我如何在bfm中使用此功能 例如,在delay_type==time的情况下,我希望能够做到: 3ns,其中3ns是延迟字符串 在delay_type==event的情况下,我希望能够等待事件,例如等待某个信号的posedge。不能将字符

System verilog 如何将整数变量放入任务字符串中?

实际上,我的任务是读取寄存器: 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,但我想

System verilog uvm_序列的参数化uvm_事件

在我的验证环境中,我为可重用性设置了一些常见序列: 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)

System verilog ';运行';阶段准备好进入';摘录';阶段

我正在尝试使用脚本运行几个测试用例。但在运行第一个测试用例后,我收到一条错误消息。这将停止模拟。我正在将日志与此邮件一起附加。我不明白为什么会发生这种情况 我查看了以前的帖子,并在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

System verilog 测试用例在开始时挂起\u项

我一直面临着一个关于启动项目的问题。每次它到达开始项目,我的整个测试都会挂起,我无法找出问题所在。任何指点都将不胜感激 下面是代码的样子: 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

System verilog 结构的优点是什么?

我是Verilog用户,所以我不熟悉SystemVerilog 现在我正在努力学习 使用结构的优点是什么?SystemVerilog中的结构或多或少类似于C语言中的结构用法,结构是在单个名称下的不同数据类型、变量或常量的集合。有关更多详细信息,请始终参考SystemVerilog LRM♦ 7.2结构 我将在这里解释结构更常见的用法和优点 结构声明可以通过变量或网络完成,结构作为一个整体可以通过使用var关键字声明为变量,结构可以使用Verilog数据类型wire或tri定义为网络,当定义为网络

System verilog Verilog系统中的位缩减一元运算符

在系统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

System verilog 如何在systemverilog中调用另一个对象中的任务?

对象C下有一个任务T,对象B和C在对象a下处于同一级别。当超时时,对象B如何调用对象C下的任务T? 提前感谢。 无法在其作用域之外访问普通方法 但是,如果您在中定义了静态方法,比如类C。要在类B中访问此方法,请使用范围解析“:“具有类名的运算符” 例如,访问从C类到B类的静态“显示”方法 class B; function void display(); C::display(); endfunction endclass 您需要用一些示例代码来说明B和C的类型。您还需要

System verilog SystemVerilog断言

我有以下接口: 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

System verilog 是否可以将压缩结构与DPI一起使用

假设我有一个压缩结构: 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

System verilog Modelsim对SV的支持

我目前正在使用modelsim SE 5.8e。它不支持SystemVerilog。我需要使用SystemVerilog来设计和验证我的项目。知道哪个版本的Modelsim同时支持sytemverilog的设计和验证子集吗?我以前使用过VCS,并试图找到是否可以使用Modelsim而不是VCS进行模拟 提前谢谢 您使用的是学生版,请尝试其中一种 我想没有开源的模拟器,如果你发现了什么,请告诉我们 其他选项您也可以使用诸如签出之类的其他功能。根据,ModelSim支持SystemVerilog设计

System verilog 何时在断言中使用带有信号的$rose系统任务

我试图理解在断言中何时使用$rose作为信号。例如,下面的两个断言在哪些方面表现不同 first:assert property (@(posedge clk) $rose(reset) |-> (data == 0)); second: assert property (@(posedge clk) reset |-> (data==0)); 是不是要将$rose与异步信号一起使用?$rose表示在上一个时钟周期中,信号为“0”,而在当前时

System verilog SystemVerilog接口多路复用器

我是systemverilog的新手,正在尝试构建systemverilog测试台。 我有一个DUT,应该通过多路复用器连接到两个外部模块之一。我想在模拟过程中切换连接,我想使用systemverilog接口连接DUT和多路复用器,以及多路复用器和两个外部模块之间的连接。接口中的信号是双向的 我在写多路复用器时遇到了麻烦。对于当前的实现,我得到一个错误,表达式的LHS不能是导线。如果我将接口中的类型更改为logic,我会得到一个错误,即双向信号不可能实现这一点。 我试着用谷歌搜索,但没有找到任何

System verilog 使用fgetc读取的文件在末尾添加FF

我正在使用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");

System verilog 带有实例名称列表的SystemVerilog接口数据类型

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

System verilog 使用邮箱的FIFO建模

我试图理解以下使用邮箱的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)

System verilog 访问寄存器时尝试预测的警告意味着什么?

我有一个UVM验证环境 在我的测试序列中,在收到中断时,我通过前门(串行事务)从REGA读取(镜像) 在我的记分板中,我使用了.predict方法来更新REGA的预期值 但是,我有以下错误: Register "regmodel.REGA" value read from DUT (0x00000000000000AA) does not match mirrored value (0x0000000000000000) 从DUT读取的值是正确的(AA),若我打印预测方法中使用的值,那个么它也

System verilog SVA中的蕴涵(>;)和##0有什么区别?

以下陈述之间的细微差别是什么 a->bvsa##0 b 在SVA(SystemVerilog断言)中,首先要检查的是单个蕴涵运算符的语法,即a |->b 在SystemVerilog断言中有两个表达式 a##0b a |->b 实际上,它在表达式上看起来很相似。此表达式的第一个步骤是检查a是否被断言(1),以及0个时钟周期后b是否被断言(1)。第二个表达式是在断言a时检查b是否(打开)断言(1),然后在同一posedge上断言b是否(1) 现在,实际上,当验证工程师编写这种断言时,他们会考虑以下

System verilog 通过任务驱动虚拟接口信号的位片

我试图创建一个任务,负责设置一个向量位,并在一个时钟周期后清除它。我的驾驶员代码附在下面: 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

System verilog 使用'';内`包含指令

我遇到了一些代码,它们的功能如下: `include "./some_path/some_file.svh" 这是否等于: `include "some_path/some_file.svh" ? LRM声明,相对路径被视为从编译器的当前工作目录或用户指定的位置开始,因此我希望“.”可以替换这些路径中的任何一个 我猜其目的是指定一个与包含文件的位置相关的路径,而有些人并不真正理解他们在做什么。这将取决于操作系统,而不是SystemVerilog LRM的一部分。../通常意味着只搜索当前工作

System verilog 将8位值传递给1位端口?

我用的是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,但是如果我想指定一个不同的位呢?例如,如果我想发送.

System verilog 为什么UVM的约束随机化不起作用?

我有一些简化的测试结构。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

System verilog 在一个接口中驱动两个不同的序列项

假设我只有一个接口和序列项的多个定义: class link_pkt extends uvm_sequence_item; class phy_pkt extends uvm_sequence_item; 在测试期间,这些项目可以通过该接口动态传输出去 实现驱动程序/定序器的正确方法是什么?一个司机够了吗?或者需要一个以上的驱动程序 似乎由于序列项的多个定义,我需要不止一个驱动程序和序列器。但这并不好,因为我无法控制/仲裁传输 有类似的情况,这是一种静态-我们不能切换驱动器的飞行。我需要的是

System verilog 访问接口路径的好方法

请帮助找到一个解决方案,有好看的代码 因此,在我的代码中,我必须做几次强制,因为同一根电线是由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_

System verilog 通过TLM端口将浮点数从SystemVerilog传输到SystemC

我在C/C++中实现了一个特定的过滤器,“封装”在SystemC模块中。我想在基于SystemVerilog的实际验证环境(VE)中使用此过滤器。为了将数据从过滤器和传输到过滤器,我想实现一个TLM连接。对于TLM,有一种称为“通用有效负载”的东西,基本上定义了可以通过TLM传输的内容,即字节数组 typedef union packed { real value; byte unsigned array[8]; } real_u; 因此,我需要将VE中的数据样本从数据类型real转换

System verilog 原语的SystemVerilog断言

有没有办法为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 :

System verilog 如何在特定信号打开后写入覆盖点以检查信号是否打开?

在这里,我试图写一个覆盖点来检查信号a打开后是否有信号b(打开) 我相信当两个信号都打开时,上述覆盖点会检查。我不确定我们到底是如何编写我提到的场景的。任何帮助都将不胜感激。另外,如果您知道如何学习system Verilog,请帮助我获取最佳资源。cover指令使用时间序列比使用covergroup要好得多,但这需要采样时钟: check: cover property (@(posedge clk) a |-> ##[*] b; ); check: cover property (@

System verilog 动态对象的NBA

我在某个地方读到过,类对象、动态数组等动态对象不允许非阻塞赋值 我的示例代码是 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

System verilog “事件”是如何工作的?

我在学习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

System verilog SystemVerilog中结构的切片数组

假设有一个结构声明为: 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];

System verilog 重写systemverilog中的内置示例方法

我的问题是,通过多个线程同时采样一个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

System verilog 模拟计时问题

请帮助我了解一些与时间刻度相关的模拟器行为。 这是我的顶级模块:   这是我的模拟脚本: irun \ … -timescale 1ns/1ps \ … 当我运行模拟时,我看到clk_62p5时钟周期是16ps而不是16ns。你能解释我为什么有这种行为吗 第二个问题:时间单位、时间精度和时间刻度之间有什么区别?回答第二个问题: `timescale是一个编译器指令。使用编译器指令可能会导致编译顺序依赖关系,即编译文件的实际顺序所导致的不同行为或问题。假设您有三个文件: fil

System verilog 区分内联约束中的本地数据成员和子类数据成员

我有一个带有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;

System verilog 约束中多维关联数组的低维循环语法 classns\u数据结构; 随机位[63:0]ns_size=64'h0000_0000_0000_0800; endclass:ns\u数据结构 类配置; ns_数据结构ns_数据[]; 函数new(); ns_数据=新[5]; foreach(ns_数据[i]) ns_data[i]=new(); 端功能 endclass:conf x类; 随机比特[63:0]slba; 随机比特[63:0]nlb; 位[63:0]slba_前一位[31:0][位[63:0]]; conf-cfg; 位[31:0]nsid='h1; 位[63:0]num[位[31:0]]; 约束slba_nlb_内部\u ns_c { slba内部{[1:cfg.ns_数据[nsid-1].ns_大小]}; nlb内部{[0:(cfg.ns_数据[nsid-1].ns_大小-slba)]; } 约束slba_nlb_非重叠_c { 取证(slba_前[nsid,i]) { 如果(!(i%2)) { slba(slba+nlb)slba_-previous[nsid][i]->slba>slba_-previous[nsid][i+1];//slba_-previous[nsid][i+1]->(slba+nlb)>slba_-previous[nsid][i];//slba警告为 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 conf; ns_data_struct ns_data[]; function new(); ns_data = new[5]; foreach (ns_data[i]) ns_data[i] = new(); endfunction endclass : conf class x; randc bit [63:0] slba; randc bit [63:0] nlb; bit [63:0] slba_previous [bit [31:0]][bit [63:0]]; conf cfg; bit [31:0] nsid = 'h1; bit [63:0] num [bit [31:0]]; constraint slba_nlb_inside_ns_c { slba inside {[1:cfg.ns_data[nsid-1].ns_size]}; nlb inside {[0:(cfg.ns_data[nsid-1].ns_size - slba)]}; } constraint slba_nlb_non_overlapping_c { foreach(slba_previous[nsid, i]) { if(!(i%2)) { slba < slba_previous[nsid][i] -> (slba + nlb) < slba_previous[nsid] [i]; slba > slba_previous[nsid][i] -> slba > slba_previous[nsid][i+1]; // <-- Warning Here slba > slba_previous[nsid][i+1] -> (slba + nlb) > slba_previous[nsid][i+1]; // <-- Warning Here slba < slba_previous[nsid][i+1] -> slba < slba_previous[nsid][i]; // <-- Warning Here } } } function void post_randomize(); num[nsid] = (num.exists(nsid))?(num[nsid]):0; slba_previous[nsid][num[nsid]++] = slba; slba_previous[nsid][num[nsid]++] = (slba + nlb); $display("\nslba_previous - %p\n", slba_previous); endfunction function new (input conf _cfg); this.cfg = _cfg; endfunction: new endclass : x program p1; conf c; x t; initial begin c = new; t = new(c); t.nsid = 3; for(int i=0; i<15; i++) begin if(!t.randomize()) $display("ERROR : Starting LBA & NLB Provider Randomization Failed"); $display("@%0t : KARAN, Starting LBA - %0h %0d", $time, t.slba, t.slba); $display("@%0t : KARAN, Number of LBA - %0h %0d", $time, t.nlb, t.nlb); end end endprogram 约束slba\u nlb\u非重叠\u c { foreach(slba_-previous[id,i]) { 如果(id==nsid&(i%2)==0) { slba(slba+nlb)slba_-previous[id][i]->slba>slba_-previous[id][i+1]; slba>slba_-previous[id][i+1]->(slba+nlb)>slba_-previous[id][i+1]; slbaslba

您需要遍历完整的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

System verilog 如何在序列块中使用$display语句来显示系统Verilog断言(SVA)中的一些信息?

我希望序列块在执行时显示一些信息 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

System verilog 指定nettype结构的单个元素

typedef结构定义的Systemverilog网络的常用赋值样式,如 typedef struct { real V; real I; real R; } SVAstruct; // resolution function ommitted nettype SVAstruct SVAnet with res_SVA; 是 因此,网络结构的所有元素的赋值都是同时完成的。像这样的任务 P.R = 100; 给出一个错误。有什么方法可以完成个人作业吗?你不能这样做。创建具有特定数据类型的ne

System verilog 有没有办法在测试结束时获得一个断言触发(失败)的次数

我没有使用uvm或ovm,因此不能使用他们奇特的报告系统。 我想知道是否有一种简单的方法可以知道某个特定的断言在测试期间被激发了多少次,或者$error被调用了多少次。好的,这就是我的结论,不确定这是否是最好的方法/解决方案,但它是有效的。 我定义了一个systemverilog包,其中包含断言错误计数器,并在每个断言的操作块中递增该计数器。 示例代码如下: package assertion_error; int assertion_fails; endpackage : asserti

System verilog 如何在系统verilog中为模拟时间赋值

我有一个包含事务的文件,每个事务都有它发生的时间。 我想运行SystemVerilog模拟,并按时间“播放”每个事务 但是,我不想实际等待事务之间的时钟周期。 相反,我希望将事务时间(从文件)分配给SystemVerilog模拟时间(分配应在0时间内发生) 这样可以提前系统Verilog模拟时间吗? 如果是的话-如何 文件的简化版本: TIME (ns) | TRANSACTION DATA 1 | 0x1, 0x2, 0x3 5

System verilog 系统verilog中[$]运算符在声明类对象时的功能

在下面的代码段中,$的功能是什么 类名称对象[$] 它会创建无限多的对象吗?它会创建一个类变量队列,但不会创建任何类对象。必须使用另一个包含对象句柄的类变量将已创建的类对象推送到队列中: className objects[$]; className h; h = new(); objects.push_back(h); 参见IEEE 1800-2017 LRM第7.10节队列

  1    2   3   4   5   6  ... 下一页 最后一页 共 12 页