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");
|