Verilog 测试台I2C SDA赢得';不要走低
我正在用Verilog编写我有史以来的第一个I2C程序,我正在努力使用测试台 我想单独测试I2C从机,但无法设置不同的SDA值:SDA始终为1或X 我是不是要用错误的方法测试?我的想法是,我应该能够在每个时钟上设置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
模块从机(
在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