Verilog 测试台I2C SDA赢得';不要走低

Verilog 测试台I2C SDA赢得';不要走低,verilog,test-bench,Verilog,Test Bench,我正在用Verilog编写我有史以来的第一个I2C程序,我正在努力使用测试台 我想单独测试I2C从机,但无法设置不同的SDA值:SDA始终为1或X 我是不是要用错误的方法测试?我的想法是,我应该能够在每个时钟上设置SDA,看看会发生什么 游乐场: 模块从机( 在SDA之外, 输入症状自评量表(SCL); reg[4:0]怠速=4'b0000; reg[4:0]开始=4'b0001; reg[4:0]地址=4'b0010; reg[4:0]读写=4'b0011; reg[4:0]数据=4'b010

我正在用Verilog编写我有史以来的第一个I2C程序,我正在努力使用测试台

我想单独测试I2C从机,但无法设置不同的SDA值:SDA始终为1或X

我是不是要用错误的方法测试?我的想法是,我应该能够在每个时钟上设置SDA,看看会发生什么

游乐场:

模块从机(
在SDA之外,
输入症状自评量表(SCL);
reg[4:0]怠速=4'b0000;
reg[4:0]开始=4'b0001;
reg[4:0]地址=4'b0010;
reg[4:0]读写=4'b0011;
reg[4:0]数据=4'b0100;
reg[4:0]写入确认=4'b0101;
reg[4:0]停止=4'b0110;
reg[4:0]状态=4'b0000;
reg[6:0]slaveAddress=7'b0001000;
reg[6:0]地址计数器=7'b0000000;
reg readWrite=1'b0;
reg write_ack=0;
分配SDA=写入确认?0:1'bz;
始终@(posedge SCL)
开始
案件(州)
闲置:
开始
如果(SDA==0&&SCL==1)
开始

state我在
$display
语句中添加了
$time
,这清楚地表明
SDA
正在变化,但它同时也在变化(10):

您对
for
循环的缩进有误导性,因为
#1
延迟不是循环的一部分。您需要添加
begin/end
关键字以将延迟包含在
for
循环中:

  for(ii=0; ii<9; ii=ii+1) begin
    $display($time, " SDA %h to %h", SDA, bitsToSend[ii]);
    #1 force SDA = bitsToSend[ii];
  end

与仿真图相关:
module Slave_TB ();

  reg clk;

  wire SDA;
  wire SCL;

  pullup(SDA);
  pullup(SCL);

  reg [8:0] bitsToSend = 9'b000100010;

  integer ii=0;

  initial begin
        clk = 0;
        forever begin
            clk = #1 ~clk;
        end     
    end


  Slave UUT
    (.SDA(SDA),
     .SCL(SCL));

  initial 
    begin
      $display("Starting Testbench...");
  
      clk = 0;
      force SCL = clk;
  
      #10

      for(ii=0; ii<9; ii=ii+1)
        $display("SDA %h to %h", SDA, bitsToSend[ii]);
        #1 force SDA = bitsToSend[ii];

      #10;
      $finish();
    end

  initial 
  begin
    // Required to dump signals to EPWave
    $dumpfile("dump.vcd");
    $dumpvars(0);
  end

endmodule
              10 SDA 1 to 0
              10 SDA 1 to 1
              10 SDA 1 to 0
              10 SDA 1 to 0
              10 SDA 1 to 0
              10 SDA 1 to 1
              10 SDA 1 to 0
              10 SDA 1 to 0
              10 SDA 1 to 0
  for(ii=0; ii<9; ii=ii+1) begin
    $display($time, " SDA %h to %h", SDA, bitsToSend[ii]);
    #1 force SDA = bitsToSend[ii];
  end
              10 SDA 1 to 0
              11 SDA 0 to 1
              12 SDA 1 to 0
              13 SDA 0 to 0
              14 SDA 0 to 0
              15 SDA 0 to 1
              16 SDA 1 to 0
              17 SDA 0 to 0
              18 SDA 0 to 0