Hallo Kollegen, ich möchte einige Wörter über die Integration der Module in unser Pipeline-Design verlieren. Grundsätzliches: Jede Stufe beginnt mit einem großen Register, dem Pipeline-Register. In diesem Register werden die Ergebnisse der Stufe davor bei einer steigenden Taktflanke übernommen. Das sieht bsp. für EX in etwa so aus: ex_pipe:process(clk,reset) is begin if reset=RESET_ACTIVE then -- clear pipeline register with pipe init id2ex_reg <= id2ex_empty; elsif rising_edge(clk) then if flush then -- clear pipeline register id2ex_reg <= id2ex_empty; elsif stall then -- preserve pipeline register, do nothing else -- store input values id2ex_reg <= id2ex; end if; end if; end procress; Die Predicates/Register die in einer Stufe gespeichert werden, sind aus meiner Sicht auch ein Teil des großen Pipelineregisters. Nur werden sie nicht direkt von einer anderen Stufe übernommen, sondern es existiert ein zusätzliche kombinationistische Logik (kombinatorisch klingt so nach (n über k)) die das Schreiben übernimmt. Lesen ist ja sowieso kein Problem. Diese komb. Schreibprozess macht nichts anderes als bestimmt wohin und ob ein Wert aus WB überhaupt übernommen wird. pred_regs: process(clk,reset) is begin if reset = RESET_ACTIVE then preds <= preds_reset_value; elsif rising_edge(clk) then preds <= preds_next; end if; end process; -- Bei den Predicates kommt der komplett neue Satz -- an Werten daher, bei den Registern hat man nur -- einen neuen Wert, den man an eine bestimmte -- Register-Adresse schreiben muss. pred_comb:process(wb2ex) is begin preds_next <= preds; if wp_en='1' and <other things> then preds_next <= some_logic; end if; end process; pred_sel:process(id2ex,wb2ex) is begin -- forwarding not used here for clarity pa_val <= preds(TO_INTEGER(unsigned(id2ex.ra))); pb_val <= preds(TO_INTEGER(unsigned(id2ex.rb))); end process; Momentan hat Martin seine Register noch in einer eigenen Entity. Prinzipiell kein Problem, wenn es so klar gekennzeichnet ist, wie in seinem Fall. Man muss nur darauf achten, dass man nicht den Überblick verliert, was wann wo gespeichert wird. Um obiges Konzept umzusetzen habe ich ein 2stufiges Typedefinitionsschema angewendet. Daten die zwischen Pipeline-Stufen ausgetauscht werden, werden über Records im File "pipeline_types.vhd" definiert. Um Daten innerhalb einer Stufe zu verschieben, gibt es "xx_stage_types.vhd". Das dabei verwendete Namensschema ist einfach <stage>2<module>_type oder <module>2<stage>_type bzw. <stagefrom>2<stage>_type. Das ist aber Geschmackssache. Hab das aus HW-Mod so übernommen. lg Günther