sv实验1

实验框架

1.从Verilog到sv

 

 

1.1-1.2

 一致。sv继承于v,所以v的代码可以在sv环境运行;sv并未严格区分reg和wire类型

 1.3

修改前

 

修改后

 

 

 logic类型默认处置为x,而bit类型默认初值为0;

2.方法和函数

 

 2.1-2.5

task clk_gen(input int peroid);
    int    N;
    N=peroid*0.5;
  clk <= 0;
  forever begin
    #N clk<= !clk;
  end
endtask

initial begin
  // generate clk
  clk_gen(20);
end

task rstn_gen();
  #10 rstn <= 0;
  repeat(10) @(posedge clk);
  rstn <= 1;
endtask

initial begin
  // trigger rstn
  rstn_gen();
end

1.不能,因为没有给clk;2.恢复正常;

3.initial中的task是顺序执行的,而时钟与复位信号要不间断执行,所以不能在一个task里面;

4.可以。5.`timescale 1ns/1ps,1ns指的是时间单位,1ps指的是时间精度,单位改变,周期必定改变

3.数组的使用

logic [31:0] chnl0_arr[];
logic [31:0] chnl1_arr[];
logic [31:0] chnl2_arr[];

initial begin
    chnl0_arr=new[100];
    chnl1_arr=new[100];
    chnl2_arr=new[100];
    foreach(chnl0_arr[i]) begin
        chnl0_arr[i] = 'h00C0_00000 + i;
        chnl1_arr[i] = 'h00C1_00000 + i;
        chnl2_arr[i] = 'h00C2_00000 + i;
  end
end

initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  foreach(chnl0_arr[i])
  chnl_write(0,chnl0_arr[i]);
  foreach(chnl1_arr[i])
  chnl_write(1,chnl1_arr[i]);
  foreach(chnl2_arr[i])
  chnl_write(2,chnl2_arr[i]);
end

4.验证结构

 

 tb4与tb3最大的不同是把dut和激励发生器单独划分,所以用一个单独的模块initiator来控制数据发送和空闲周期,而数据产生仍交给tb模块完成。同时将三个通道的数据发送分别由三个initial实现三通道并行发送数据。

`timescale 1ns/1ps
module chnl_initiator(
  input               clk,
  input               rstn,
  output logic [31:0] ch_data,
  output logic        ch_valid,
  input               ch_ready,
  input        [ 5:0] ch_margin
);
string name;
function void set_name(string s);
  name = s;
endfunction

task chnl_write(input logic[31:0] data);
  @(posedge clk);
  ch_valid <= 1;
  ch_data <= data;
  @(negedge clk);
  wait(ch_ready === 'b1);
  $display("%t channel initial [%s] sent data %x", $time, name, data);
endtask

task chnl_idle();
  @(posedge clk);
  ch_valid <= 0;
  ch_data <= 0;
endtask
endmodule

module tb4;
...
...
initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  chnl0_init.set_name("chnl0_init");
  foreach(chnl0_arr[i]) chnl0_init.chnl_write(chnl0_arr[i]);
  chnl0_init.chnl_idle();
end

initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  chnl1_init.set_name("chnl1_init");
  foreach(chnl1_arr[i]) chnl1_init.chnl_write(chnl1_arr[i]);
  chnl1_init.chnl_idle();
end

initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  chnl2_init.set_name("chnl2_init");
  foreach(chnl2_arr[i]) chnl2_init.chnl_write(chnl2_arr[i]);
  chnl2_init.chnl_idle();
end

chnl_initiator chnl0_init(
  .clk      (clk),
  .rstn     (rstn),
  .ch_data  (ch0_data),
  .ch_valid (ch0_valid),
  .ch_ready (ch0_ready),
  .ch_margin(ch0_margin) 
);

chnl_initiator chnl1_init(
  .clk      (clk),
  .rstn     (rstn),
  .ch_data  (ch1_data),
  .ch_valid (ch1_valid),
  .ch_ready (ch1_ready),
  .ch_margin(ch1_margin) 
);

chnl_initiator chnl2_init(
  .clk      (clk),
  .rstn     (rstn),
  .ch_data  (ch2_data),
  .ch_valid (ch2_valid),
  .ch_ready (ch2_ready),
  .ch_margin(ch2_margin) 
);

endmodule

 

posted @ 2022-09-19 22:54  继续加仓  阅读(125)  评论(0)    收藏  举报