how assign input bidirectional port in verilog testbench ?
i have design , associated testbench. relevant part of design follows:
module i2cmodule ( input wire mod_en , input wire rec_ack , input wire burst_write , burst_read , input wire [7 : 0] data_tx , output wire [7 : 0] data_rx , output wire ack , inout wire scl , inout wire sda ) ; // code here send_command : begin case (bit_counter) // parallel serial convertor 7 : sda_reg = ( !scl) ? data_tx[7] : sda_reg ; 6 : sda_reg = ( !scl) ? data_tx[6] : sda_reg ; 5 : sda_reg = ( !scl) ? data_tx[5] : sda_reg ; 4 : sda_reg = ( !scl) ? data_tx[4] : sda_reg ; 3 : sda_reg = ( !scl) ? data_tx[3] : sda_reg ; 2 : sda_reg = ( !scl) ? data_tx[2] : sda_reg ; 1 : sda_reg = ( !scl) ? data_tx[1] : sda_reg ; 0 : sda_reg = ( !scl) ? data_tx[0] : sda_reg ; endcase start_bit_counter = (scl && !bit_counter) ? 1'b0 : start_bit_counter ; i2c_next = (!start_bit_counter) ? wait_ack : send_command ; end wait_ack : begin ack_reg = ( scl) ? sda : ack_reg ; start_bit_counter = ( scl) ? 1'b1 : 1'b0 ; i2c_next = (scl && !ack_reg) ? (data_tx[7] ? rx_mode : tx_mode ) : wait_ack ; end // code here testbench follows:
module i2c_test; // inputs reg mod_en; reg rec_ack; reg burst_write; reg burst_read; reg [7:0] data_tx; // outputs wire [7:0] data_rx; wire ack; // bidirs wire scl; wire sda; // stimulus here ; stimulus in initial block mod_en = 1 ; data_tx = 8'b10101010 ; // write mode repeat (8) @ (posedge scl) ; // wait 8 clocks command sent sda = 1'b0 ; // slave ack @ (posedge scl) ; the design synthesizes target device. however, in testbench, when try drive sda, gives error. also, if change sda reg, says outputs cannot reg type.
how drive sda in testbench?
if need drive bidir signal module or test bench, can this:
wire [7:0] input_value; wire [7:0] bidir_signal; reg [7:0] output_value; reg output_value_valid; mymodule myinstance ( ... ... .bidir_signal(bidir_signal), ... ... ); assign input_value = bidir_signal; assign bidir_signal = (output_value_valid==1'b1)? output_value : 8'hzz; initial begin output_value_valid = 0; // use bidir_signal input here can read current value // $display ("current value: %x\n", input_value); #100; // switch output signal: write value 10101010 in output_value_valid = 1; output_value = 8'haa; #100; $finish; end
Comments
Post a Comment