按关键词阅读: 硬件 SystemVerilo 课件 设计 PPT 建模
20、数必须显式声明为input、output或inout , 方向声明后面可以跟着逗号分隔的参数列表;SystemVerilog简化了任务和函数声明语法 , 形式参数的缺省方向为input , 缺省类型为logic 。
function integer compare ( input integer a, input integer b);
endfunction task mytask (input a, b, output y1, y2);
endtask function int compare (int a, b);
task mytask (a, b, output y1, y2);
endfunct 。
21、ion endtask,6.3 对任务和函数的改进,缺省的形式参数值:SystemVerilog允许任务与函数为每个形式参数设置一个可选的缺省值 , 设定缺省值的语法与设置变量初始值的语法类似 , 设定缺省值的任务或函数调用时 , 可以对形式参数全部指定、部分指定或不指定值 , 如果不指定值 , 则使用缺省的值 。
如果对没有缺省形式参数值的任务或函数调用时不传递值给形式参数 , 系统会报告一个错误 。
function int incrementer ( int count = 0, step = 1);
incrementer = count + step;
endfunction always (posedge c 。
22、lk) result = increment (data_bus);
SystemVerilog允许任务或函数的实际参数数目小于形式参数数目,6.3 对任务和函数的改进,数组、结构体和联合体作为形式参数:SystemVerilog允许压缩或非压缩数组、结构体或联合体传递进/出任务和函数;对于结构体和联合体 , 形式参数必须定义为用户自定义类型 。
typedef struct logic valid;
logic 7 : 0 check;
logic 63 : 0 data;
packet_t;
function void fill_packet ( input logic 7 : 0 data_i 。
23、n 7 : 0, output packet_t data_out);
for (int i = 0;
i = 7;
i +) begin data_out.data (8 * i) + : 8 = data_ini;
data_out.checki = data_ini;
end data_out.valid = 1;
endfunction,6.3 对任务和函数的改进,用引用取代复制来传递参数值:任务或函数调用时 , 通常是将输入复制后传递给任务或函数;Verilog通过使用外部名称方式隐含传递参数给任务或函数;SystemVerilog可以显式地通过引用的方法传递参数给任务或函数 , 在形式参数 。
24、说明中 , 用ref代替input、output和inout方向关键词 。
ref形式参数是实际值的别名 , 通过引用传递 , 变量只需要在调用部分声明 , 而不需要在任务或函数描述时再次声明 , 这样 , 任务或函数只在它调用的范围内引用这个变量 。
注意:只有自动函数或任务才可以具有ref参数,6.3 对任务和函数的改进,module chip ();
typedef struct logic valid;
logic 7 : 0 check;
logic 63 : 0 data;
packet_t;
packet_t data_packet;
bit 7 : 0 raw_data 0 : 7;
always (po 。
25、sedge clk) if (data_ready) fill_packet(.data_in(raw_data, .data_out(data_packet);
function automatic void fill_packet( ref logic 7 : 0 data_in 7 : 0, ref packet_t data_out);
for (int i = 0;
i = 7;
i +) begin data_out.data (8*i) + : 8 = data_ini;
data_out.checki = data_ini;
end data_out.valid = 1;
en 。
26、dfunction endmodule,6.3 对任务和函数的改进,只读引用参数:通过将形式参数说明为const ref类型 , 只允许对引用对象进行读操作 , 而禁止任务或函数改动对象内容 。
function automatic void fill_packet ( const ref logic 7 : 0 data_in 7 : 0, ref packet_t data_out);
endfunction 对使用ref参数的函数调用限制:与带有输出形参函数调用限制相同 , 不能被以下几种情况调用: 事件表达式 使用过程持续赋值的表达式 不在过程语句内的表达式,6.3 对任务和函数的改进,任务ref参 。
27、数对变化敏感:任务ref参数的一个重要特点是任务中的逻辑会对信号在调用程序内发生的变化敏感 , 由于函数必须零延时执行 , 所有函数ref参数不能包含对变化敏感的时间控制 。
typedef struct logic vaild;
logic 7 : 0 check;
logic 63 : 0 data;
packet_t;
packet_t send_pkt, received_pkt;
task automatic check_results(input packet_t sent, ref packed_t received, ref logic done);
static int error_c 。
28、nt;
wait (done) if (sent != received) begin error_cnt +;
$display(“ERROR! received bad packet”);
end endtask,1. ref参数可以读取当前值 2. ref参数可以立即传播变化而不是等到任务结束时才反映,6.3 对任务和函数的改进,命名的任务和函数结尾:SystemVerilog允许在任务和函数的结尾处用关键字endtask和endfunction后面跟任务名和函数名 。
function int add_and_inc(int a, b) return a + b +1;
endfunction : add_and_inc task automatic check_results( input packet_t sent;
ref packet_t received;
ref logic done);
static int error_cnt;
endtask : check_results 空任务和空函数:SystemVerilog允许任务和函数不包含任何语句 , 空函数将返回表示函数名的隐含变量的当前值 。
来源:(未知)
【学习资料】网址:/a/2021/0207/0021331047.html
标题:SystemVerilog|SystemVerilog硬件设计及建模第6章ppt课件( 三 )