// Nonstop version of loop // Always keeps looping when increase == true // At end is a signal to indicate the next cycle is end // Use that to signal parent loop to advance. `define NONSTOP_LOOP(iter, width, init, ready, finish, min, extent)\ reg [width-1:0] iter;\ wire finish;\ always@(posedge clk) begin\ if (rst || init) begin\ iter <= (min);\ end else if(ready) begin\ if (iter != ((extent)-1)) begin\ iter <= iter + 1;\ end else begin\ iter <= (min);\ end\ end else begin\ iter <= iter;\ end\ end\ assign finish = (ready && (iter == (extent) - 1)); // Wrap a nonstop loop to normal loop that loop only once. // Use done signal to control the non-stop body to stop. // The init and done behaves like normal loop `define WRAP_LOOP_ONCE(init, valid, ready, body_finish, body_ready)\ reg valid;\ wire body_ready;\ always@(posedge clk) begin\ if (rst || init) begin\ valid <= 1;\ end else if(body_finish) begin\ valid <= 0;\ end else begin\ valid <= valid;\ end\ end\ assign body_ready = (valid && ready); // Assign dst as src delayed by specific cycles. `define DELAY(dst, src, width, delay, not_stall)\ reg [(width)*(delay)-1:0] src``_dly_chain;\ always@(posedge clk) begin\ if(rst) begin\ src``_dly_chain <= 0;\ end else if (not_stall) begin\ src``_dly_chain[(width)-1:0] <= src;\ if((delay) != 1) begin\ src``_dly_chain[(delay)*(width)-1:(width)] <= src``_dly_chain[((delay)-1)*(width)-1:0];\ end\ end else begin\ src``_dly_chain <= src``_dly_chain;\ end\ end\ assign dst = src``_dly_chain[(delay)*(width)-1:((delay)-1)*(width)]; // TVM generate clock signal `define TVM_DEFINE_TEST_SIGNAL(clk, rst)\ parameter PER = 10;\ reg clk;\ reg rst;\ always begin\ #(PER/2) clk =~ clk;\ end // Control logic on buffer/RAM read valid. // This delays the valid signal by one cycle and retain it when write_ready == 0 `define BUFFER_READ_VALID_DELAY(dst, data_valid, write_ready)\ reg dst;\ always@(posedge clk) begin\ if(rst) begin\ dst <= 0;\ end else if (write_ready) begin\ dst <= (data_valid);\ end else begin\ dst <= dst;\ end\ end\ // A cache register that add one cycle lag to the ready signal // This allows the signal to flow more smoothly `define CACHE_REG(width, in_data, in_valid, in_ready, out_data, out_valid, out_ready)\ reg [width-1:0] out_data``_state_;\ reg [width-1:0] out_data``_overflow_;\ reg out_valid``_state_;\ reg out_valid``_overflow_;\ always@(posedge clk) begin\ if(rst) begin\ out_valid``_overflow_ <= 0;\ out_valid``_state_ <= 0;\ end else if (out_valid``_overflow_) begin\ if (out_ready) begin\ out_valid``_state_ <= 1;\ out_data``_state_ <= out_data``_overflow_;\ out_valid``_overflow_ <= 0;\ out_data``_overflow_ <= 0;\ end else begin\ out_valid``_state_ <= 1;\ out_data``_state_ <= out_data``_state_;\ out_valid``_overflow_ <= out_valid``_overflow_;\ out_data``_overflow_ <= out_data``_overflow_;\ end\ end else begin\ if (!out_ready && out_valid``_state_) begin\ out_valid``_state_ <= 1;\ out_data``_state_ <= out_data``_state_;\ out_valid``_overflow_ <= in_valid;\ out_data``_overflow_ <= in_data;\ end else begin\ out_valid``_state_ <= in_valid;\ out_data``_state_ <= in_data;\ out_valid``_overflow_ <= out_valid``_overflow_;\ out_data``_overflow_ <= out_data``_overflow_;\ end\ end\ end\ // always@ (posedge clk) assign in_ready = !out_valid``_overflow_;\ assign out_data = out_data``_state_;\ assign out_valid = out_valid``_state_;