FPGA 学习小组
直播中

alexdos

6年用户 804经验值
擅长:可编程逻辑 电源/新能源 嵌入式技术 模拟技术
私信 关注

【FPGA】I²C程序的仿真与测试----主节点的仿真

主节点仿真的内容包括读数据、写数据和比较数据 3 部分,代码如下:

  1. `include "timescale.v"
  2. //模块定义
  3. module wb_master_model(clk, rst, adr, din, dout, cyc, stb, we, sel, ack, err, rty);
  4. //参数
  5. parameter dwidth = 32;
  6. parameter awidth = 32;
  7. //输入、输出
  8. input clk, rst;
  9. output [awidth -1:0] adr;
  10. input [dwidth -1:0] din;
  11. output [dwidth -1:0] dout;
  12. output cyc, stb;
  13. output we;
  14. output [dwidth/8 -1:0] sel;
  15. input ack, err, rty;
  16. //WIRE 定义
  17. reg [awidth -1:0] adr;
  18. reg [dwidth -1:0] dout;
  19. reg cyc, stb;
  20. reg we;
  21. reg [dwidth/8 -1:0] sel;
  22. reg [dwidth -1:0] q;
  23. // 存储逻辑
  24. //初始化
  25. initial
  26.                 begin
  27.                                 adr = {awidth{1'bx}};
  28.                                 dout = {dwidth{1'bx}};
  29.                                 cyc = 1'b0;
  30.                                 stb = 1'bx;
  31.                                 we = 1'hx;
  32.                                 sel = {dwidth/8{1'bx}};
  33.                                 #1;
  34.                 end
  35. // 写数据周期
  36. task wb_write;
  37.                 input delay;
  38.                 integer delay;
  39.                 input [awidth -1:0] a;
  40.                 input [dwidth -1:0] d;
  41.                 begin
  42.                 // 延迟
  43.                                 repeat(delay) @(posedge clk);
  44.                                 // 设置信号值
  45.                                 #1;
  46.                                 adr = a;
  47.                                 dout = d;
  48.                                 cyc = 1'b1;
  49.                                 stb = 1'b1;
  50.                                 we = 1'b1;
  51.                                 sel = {dwidth/8{1'b1}};
  52.                                 @(posedge clk);
  53.                                 // 等待从节点的应答信号
  54.                                 while(~ack) @(posedge clk);
  55.                                 #1;
  56.                                 cyc = 1'b0;
  57.                                 stb = 1'bx;
  58.                                 adr = {awidth{1'bx}};
  59.                                 dout = {dwidth{1'bx}};
  60.                                 we = 1'hx;
  61.                                 sel = {dwidth/8{1'bx}};
  62.                 end
  63. endtask
  64. // 读数据周期
  65. task wb_read;        
  66.                 input delay;
  67.                 integer delay;
  68.                 input [awidth -1:0]a;
  69.                 output [dwidth -1:0] d;
  70.                 begin
  71.                                 // 延迟
  72.                                 repeat(delay) @(posedge clk);
  73.                                 // 设置信号值
  74.                                 #1;
  75.                                 adr = a;
  76.                                 dout = {dwidth{1'bx}};
  77.                                 cyc = 1'b1;
  78.                                 stb = 1'b1;
  79.                                 we = 1'b0;
  80.                                 sel = {dwidth/8{1'b1}};
  81.                                 @(posedge clk);
  82.                                 // 等待从节点应答信号
  83.                                 while(~ack) @(posedge clk);
  84.                                 #1;
  85.                                 cyc = 1'b0;
  86.                                 stb = 1'bx;
  87.                                 adr = {awidth{1'bx}};
  88.                                 dout = {dwidth{1'bx}};
  89.                                 we = 1'hx;
  90.                                 sel = {dwidth/8{1'bx}};
  91.                                 d = din;
  92.                 end
  93. endtask
  94. // 比较数据
  95. task wb_cmp;
  96.                 input delay;
  97.                 integer delay;
  98.                 input [awidth -1:0] a;
  99.                 input [dwidth -1:0] d_exp;
  100.                 begin
  101.                                 wb_read (delay, a, q);
  102.                                 if (d_exp !== q)
  103.                                 $display("Data compare error. Received %h, expected %h at time %t", q, d_exp,$time);
  104.                 end
  105. endtask
  106. endmodule

更多回帖

发帖
×
20
完善资料,
赚取积分