OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0_rc2/] [or1ksim/] [cuc/] [verilog.c] - Diff between revs 883 and 902

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 883 Rev 902
Line 159... Line 159...
  char tmp[256];
  char tmp[256];
  cuc_bb *end_bb = NULL;
  cuc_bb *end_bb = NULL;
  int end_bb_no = -1;
  int end_bb_no = -1;
  sprintf (tmp, "%s.v", filename);
  sprintf (tmp, "%s.v", filename);
 
 
  log ("Generating verilog file \"%s\"\n", filename);
  log ("Generating verilog file \"%s\"\n", tmp);
  printf ("Generating verilog file \"%s\"\n", filename);
  printf ("Generating verilog file \"%s\"\n", tmp);
  if ((fo = fopen (tmp, "wt+")) == NULL) {
  if ((fo = fopen (tmp, "wt+")) == NULL) {
    fprintf (stderr, "Cannot open '%s'\n", tmp);
    fprintf (stderr, "Cannot open '%s'\n", tmp);
    exit (1);
    exit (1);
  }
  }
 
 
  for (b = 0; b < f->num_bb; b++)
  for (b = 0; b < f->num_bb; b++)
    if (f->bb[b].type & BB_END) end_bb = &f->bb[end_bb_no = b];
    if (f->bb[b].type & BB_END) end_bb = &f->bb[end_bb_no = b];
  assert (end_bb && end_bb->type & BB_END);
  assert (end_bb && end_bb->type & BB_END);
 
 
  /* output header */
  /* output header */
  fprintf (fo, "/* %s -- generated by OpenRISC Custom Unit Compiler (c) OpenCores */\n", tmp);
  fprintf (fo, "/* %s -- generated by OpenRISC Custom Unit Compiler\n", tmp);
 
  fprintf (fo, "   (C) 2002 OpenCores.\n");
 
  fprintf (fo, "   function   \"%s\"\n", filename);
 
  fprintf (fo, "   at         %08x - %08x\n", f->start_addr, f->end_addr);
 
  fprintf (fo, "   num BBs    %i */\n\n", f->num_bb);
  fprintf (fo, "module %s (clk, rst,\n", filename);
  fprintf (fo, "module %s (clk, rst,\n", filename);
  fprintf (fo, "              lwb_adr_o, lwb_dat_i, lwb_cycstb_o,\n");
  fprintf (fo, "              lwb_adr_o, lwb_dat_i, lwb_cycstb_o,\n");
  fprintf (fo, "              lwb_sel_o, lwb_linbrst_o, lwb_ack_i,\n");
  fprintf (fo, "              lwb_sel_o, lwb_linbrst_o, lwb_ack_i,\n");
  fprintf (fo, "              swb_adr_o, swb_dat_o, swb_cycstb_o,\n");
  fprintf (fo, "              swb_adr_o, swb_dat_o, swb_cycstb_o,\n");
  fprintf (fo, "              swb_sel_o, swb_linbrst_o, swb_ack_i,\n");
  fprintf (fo, "              swb_sel_o, swb_linbrst_o, swb_ack_i,\n");
Line 416... Line 420...
 
 
  fprintf (fo, "\n/* Register the bb_start */\n");
  fprintf (fo, "\n/* Register the bb_start */\n");
  fprintf (fo, "reg   [%2i:0] bb_start_r;\n\n", f->num_bb - 1);
  fprintf (fo, "reg   [%2i:0] bb_start_r;\n\n", f->num_bb - 1);
  fprintf (fo, "always @(posedge rst or posedge clk)\n");
  fprintf (fo, "always @(posedge rst or posedge clk)\n");
  fprintf (fo, "begin\n");
  fprintf (fo, "begin\n");
  fprintf (fo, "  if (rst || end_o) bb_start_r <= #1 %i'b0;\n", f->num_bb);
  fprintf (fo, "  if (rst) bb_start_r <= #1 %i'b0;\n", f->num_bb);
 
  fprintf (fo, "  else if (end_o) bb_start_r <= #1 %i'b0;\n", f->num_bb);
  fprintf (fo, "  else bb_start_r <= #1 bb_start;\n");
  fprintf (fo, "  else bb_start_r <= #1 bb_start;\n");
  fprintf (fo, "end\n");
  fprintf (fo, "end\n");
 
 
  fprintf (fo, "\n/* Logic */\n");
  fprintf (fo, "\n/* Logic */\n");
  /* output body */
  /* output body */
Line 475... Line 480...
      fprintf (fo, "    if (");
      fprintf (fo, "    if (");
      print_deps (fo, f, REF_BB(f->msched[i]), f->INSN(f->msched[i]).dep, 1);
      print_deps (fo, f, REF_BB(f->msched[i]), f->INSN(f->msched[i]).dep, 1);
      fprintf (fo, ") begin\n");
      fprintf (fo, ") begin\n");
      while (dep) {
      while (dep) {
        assert (f->INSN(dep->ref).type & IT_MEMORY);
        assert (f->INSN(dep->ref).type & IT_MEMORY);
        fprintf (fo, "      %c_end[%i] <= #1 1'b0;\n",
        fprintf (fo, "      %c_stb[%i] <= #1 1'b0;\n",
                  II_IS_LOAD (f->INSN(dep->ref).index) ? 'l' : 's', find_ls_index (f, dep->ref));
                  II_IS_LOAD (f->INSN(dep->ref).index) ? 'l' : 's', find_ls_index (f, dep->ref));
        dep = dep->next;
        dep = dep->next;
      }
      }
      fprintf (fo, "      l_stb[%i] <= #1 1'b1;\n", cur_load++);
      fprintf (fo, "      l_stb[%i] <= #1 1'b1;\n", cur_load++);
      fprintf (fo, "      lwb_cycstb_o <= #1 1'b1;\n");
      fprintf (fo, "      lwb_cycstb_o <= #1 1'b1;\n");
      fprintf (fo, "      lwb_sel_o[3:0] <= #1 4'b");
      fprintf (fo, "      lwb_sel_o[3:0] <= #1 4'b");
      switch (f->mtype[i] & MT_WIDTH) {
      switch (f->mtype[i] & MT_WIDTH) {
        case 1: fprintf (fo, "0001 << (%s & 32h'3);\n",
        case 1: fprintf (fo, "0001 << (%s & 32'h3);\n",
                                print_op_v (f, t, f->msched[i], 1)); break;
                                print_op_v (f, t, f->msched[i], 1)); break;
        case 2: fprintf (fo, "0011 << ((%s & 32h'1) << 1);\n",
        case 2: fprintf (fo, "0011 << ((%s & 32'h1) << 1);\n",
                                print_op_v (f, t, f->msched[i], 1)); break;
                                print_op_v (f, t, f->msched[i], 1)); break;
        case 4: fprintf (fo, "1111;\n"); break;
        case 4: fprintf (fo, "1111;\n"); break;
        default: assert (0);
        default: assert (0);
      }
      }
      fprintf (fo, "      lwb_linbrst_o <= #1 1'b%i;\n",
      fprintf (fo, "      lwb_linbrst_o <= #1 1'b%i;\n",
Line 530... Line 535...
      fprintf (fo, "    if (");
      fprintf (fo, "    if (");
      print_deps (fo, f, REF_BB(f->msched[i]), f->INSN(f->msched[i]).dep, 1);
      print_deps (fo, f, REF_BB(f->msched[i]), f->INSN(f->msched[i]).dep, 1);
      fprintf (fo, ") begin\n");
      fprintf (fo, ") begin\n");
      while (dep) {
      while (dep) {
        assert (f->INSN(dep->ref).type & IT_MEMORY);
        assert (f->INSN(dep->ref).type & IT_MEMORY);
        fprintf (fo, "      %c_end[%i] <= #1 1'b0;\n",
        fprintf (fo, "      %c_stb[%i] <= #1 1'b0;\n",
                  II_IS_LOAD (f->INSN(dep->ref).index) ? 'l' : 's', find_ls_index (f, dep->ref));
                  II_IS_LOAD (f->INSN(dep->ref).index) ? 'l' : 's', find_ls_index (f, dep->ref));
        dep = dep->next;
        dep = dep->next;
      }
      }
      fprintf (fo, "      s_stb[%i] <= #1 1'b1;\n", cur_store++);
      fprintf (fo, "      s_stb[%i] <= #1 1'b1;\n", cur_store++);
      fprintf (fo, "      swb_cycstb_o <= #1 1'b1;\n");
      fprintf (fo, "      swb_cycstb_o <= #1 1'b1;\n");
      fprintf (fo, "      swb_sel_o[3:0] <= #1 4'b");
      fprintf (fo, "      swb_sel_o[3:0] <= #1 4'b");
      switch (f->mtype[i] & MT_WIDTH) {
      switch (f->mtype[i] & MT_WIDTH) {
        case 1: fprintf (fo, "0001 << (%s & 32h'3);\n",
        case 1: fprintf (fo, "0001 << (%s & 32'h3);\n",
                                print_op_v (f, t, f->msched[i], 1)); break;
                                print_op_v (f, t, f->msched[i], 1)); break;
        case 2: fprintf (fo, "0011 << ((%s & 32h'1) << 1);\n",
        case 2: fprintf (fo, "0011 << ((%s & 32'h1) << 1);\n",
                                print_op_v (f, t, f->msched[i], 1)); break;
                                print_op_v (f, t, f->msched[i], 1)); break;
        case 4: fprintf (fo, "1111;\n"); break;
        case 4: fprintf (fo, "1111;\n"); break;
        default: assert (0);
        default: assert (0);
      }
      }
      fprintf (fo, "      swb_linbrst_o <= #1 1'b%i;\n",
      fprintf (fo, "      swb_linbrst_o <= #1 1'b%i;\n",
Line 565... Line 570...
  }
  }
 
 
  fprintf (fo, "\n/* Basic blocks state machine */\n");
  fprintf (fo, "\n/* Basic blocks state machine */\n");
  fprintf (fo, "always @(posedge clk or posedge rst)\n");
  fprintf (fo, "always @(posedge clk or posedge rst)\n");
  fprintf (fo, "begin\n");
  fprintf (fo, "begin\n");
  fprintf (fo, "  if (rst || end_o) begin\n");
  fprintf (fo, "  if (rst) bb_stb <= #1 %i'h%x;\n", f->num_bb, 0);
  fprintf (fo, "    bb_stb <= #1 %i'h%x;\n", f->num_bb, 0);
  fprintf (fo, "  else if (end_o) bb_stb <= #1 %i'h%x;\n", f->num_bb, 0);
  for (i = 0; i < f->num_bb; i++) {
  for (i = 0; i < f->num_bb; i++) {
    fprintf (fo, "  end else if (bb_start[%i]) begin\n", i);
    fprintf (fo, "  else if (bb_start[%i]) begin\n", i);
    fprintf (fo, "    bb_stb <= #1 %i'h%x;\n", f->num_bb, 1 << i);
    fprintf (fo, "    bb_stb <= #1 %i'h%x;\n", f->num_bb, 1 << i);
  }
  }
  fprintf (fo, "  end else if (end_o) begin\n");
  fprintf (fo, "  end else if (end_o) begin\n");
  fprintf (fo, "    bb_stb <= #1 %i'h%x;\n", f->num_bb, 0);
  fprintf (fo, "    bb_stb <= #1 %i'h%x;\n", f->num_bb, 0);
  fprintf (fo, "  end\n");
  fprintf (fo, "  end\n");

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.