diff --git a/changelog/2025-11-10T09_31_42+00_00_consistent_verilog_indices b/changelog/2025-11-10T09_31_42+00_00_consistent_verilog_indices new file mode 100644 index 0000000000..e51c0c3112 --- /dev/null +++ b/changelog/2025-11-10T09_31_42+00_00_consistent_verilog_indices @@ -0,0 +1 @@ +CHANGED: Vector functions in Verilog now have indices consistent with the Vec inputs/outputs (before they were reversed). This is convenient when writing design constraints, which can now be referenced consistently like `imap[0],imap[1],..`. See [#3088](https://github.com/clash-lang/clash-compiler/issues/3088). diff --git a/clash-lib/prims/verilog/Clash_Sized_Vector.primitives.yaml b/clash-lib/prims/verilog/Clash_Sized_Vector.primitives.yaml index e209214d5b..b38f977732 100644 --- a/clash-lib/prims/verilog/Clash_Sized_Vector.primitives.yaml +++ b/clash-lib/prims/verilog/Clash_Sized_Vector.primitives.yaml @@ -86,15 +86,16 @@ // map begin genvar ~GENSYM[i][1]; ~GENERATE - for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[map][2]~IF~SIZE[~TYP[1]]~THEN + for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[map][2] + localparam ~GENSYM[vec_index][5] = ~MAXINDEX[~TYPO] - ~SYM[1];~IF~SIZE[~TYP[1]]~THEN wire ~TYPEL[~TYP[1]] ~GENSYM[map_in][3]; - assign ~SYM[3] = ~VAR[vec][1][~SYM[1]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI + assign ~SYM[3] = ~VAR[vec][1][~SYM[5]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI ~OUTPUTUSAGE[0] ~TYPEL[~TYPO] ~GENSYM[map_out][4]; ~INST 0 ~OUTPUT <= ~SYM[4]~ ~TYPEL[~TYPO]~ ~INPUT <= ~SYM[3]~ ~TYPEL[~TYP[1]]~ ~INST - assign ~RESULT[~SYM[1]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[4]; + assign ~RESULT[~SYM[5]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[4]; end ~ENDGENERATE // map end @@ -108,18 +109,19 @@ genvar ~GENSYM[i][1]; ~GENERATE for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[imap][2] + localparam ~GENSYM[vec_index][6] = ~MAXINDEX[~TYPO] - ~SYM[1]; wire [~SIZE[~INDEXTYPE[~LIT[0]]]-1:0] ~GENSYM[map_index][3];~IF~SIZE[~TYP[2]]~THEN wire ~TYPEL[~TYP[2]] ~GENSYM[map_in][4]; - assign ~SYM[4] = ~VAR[vec][2][~SYM[1]*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI + assign ~SYM[4] = ~VAR[vec][2][~SYM[6]*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI ~OUTPUTUSAGE[1] ~TYPEL[~TYPO] ~GENSYM[map_out][5]; - assign ~SYM[3] = ~SIZE[~INDEXTYPE[~LIT[0]]]'d~MAXINDEX[~TYPO] - ~SYM[1][0+:~SIZE[~INDEXTYPE[~LIT[0]]]]; + assign ~SYM[3] = ~SYM[1][0+:~SIZE[~INDEXTYPE[~LIT[0]]]]; ~INST 1 ~OUTPUT <= ~SYM[5]~ ~TYPEL[~TYPO]~ ~INPUT <= ~SYM[3]~ ~INDEXTYPE[~LIT[0]]~ ~INPUT <= ~SYM[4]~ ~TYPEL[~TYP[2]]~ ~INST - assign ~RESULT[~SYM[1]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; + assign ~RESULT[~SYM[6]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; end ~ENDGENERATE // imap end @@ -129,25 +131,26 @@ kind: Declaration type: 'imap_go :: (Index n -> a -> b) -> Vec m a -> Index n -> Vec m b' template: |- - // imap begin + // imap_go begin genvar ~GENSYM[i][1]; ~GENERATE - for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[imap][2] + for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[imap_go][2] + localparam ~GENSYM[vec_index][6] = ~MAXINDEX[~TYPO] - ~SYM[1]; wire ~TYP[2] ~GENSYM[map_index][3];~IF~SIZE[~TYP[1]]~THEN wire ~TYPEL[~TYP[1]] ~GENSYM[map_in][4]; - assign ~SYM[4] = ~VAR[vec][1][~SYM[1]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI + assign ~SYM[4] = ~VAR[vec][1][~SYM[6]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI ~OUTPUTUSAGE[0] ~TYPEL[~TYPO] ~GENSYM[map_out][5]; - assign ~SYM[3] = ~SIZE[~TYP[2]]'d~MAXINDEX[~TYPO] - ~SYM[1][0+:~SIZE[~TYP[2]]] + ~ARG[2]; + assign ~SYM[3] = ~SYM[1][0+:~SIZE[~TYP[2]]] + ~ARG[2]; ~INST 0 ~OUTPUT <= ~SYM[5]~ ~TYPEL[~TYPO]~ ~INPUT <= ~SYM[3]~ ~TYP[2]~ ~INPUT <= ~SYM[4]~ ~TYPEL[~TYP[1]]~ ~INST - assign ~RESULT[~SYM[1]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; + assign ~RESULT[~SYM[6]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; end ~ENDGENERATE - // imap end + // imap_go end workInfo: Never - BlackBox: name: Clash.Sized.Vector.zipWith @@ -157,18 +160,19 @@ // zipWith start genvar ~GENSYM[i][2]; ~GENERATE - for (~SYM[2] = 0; ~SYM[2] < ~LENGTH[~TYPO]; ~SYM[2] = ~SYM[2] + 1) begin : ~GENSYM[zipWith][6]~IF~SIZE[~TYP[1]]~THEN + for (~SYM[2] = 0; ~SYM[2] < ~LENGTH[~TYPO]; ~SYM[2] = ~SYM[2] + 1) begin : ~GENSYM[zipWith][6] + localparam ~GENSYM[vec_index][7] = ~MAXINDEX[~TYPO] - ~SYM[2];~IF~SIZE[~TYP[1]]~THEN wire ~TYPEL[~TYP[1]] ~GENSYM[zipWith_in1][3]; - assign ~SYM[3] = ~VAR[vec1][1][~SYM[2]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI~IF~SIZE[~TYP[2]]~THEN + assign ~SYM[3] = ~VAR[vec1][1][~SYM[7]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI~IF~SIZE[~TYP[2]]~THEN wire ~TYPEL[~TYP[2]] ~GENSYM[zipWith_in2][4]; - assign ~SYM[4] = ~VAR[vec2][2][~SYM[2]*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI - ~OUTPUTUSAGE[0] ~TYPEL[~TYPO] ~SYM[5]; + assign ~SYM[4] = ~VAR[vec2][2][~SYM[7]*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI + ~OUTPUTUSAGE[0] ~TYPEL[~TYPO] ~GENSYM[zip_out][5]; ~INST 0 ~OUTPUT <= ~SYM[5]~ ~TYPEL[~TYPO]~ ~INPUT <= ~SYM[3]~ ~TYPEL[~TYP[1]]~ ~INPUT <= ~SYM[4]~ ~TYPEL[~TYP[2]]~ ~INST - assign ~RESULT[~SYM[2]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; + assign ~RESULT[~SYM[7]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5]; end ~ENDGENERATE // zipWith end @@ -185,8 +189,9 @@ genvar ~GENSYM[i][3]; ~GENERATE for (~SYM[3]=0; ~SYM[3] < ~LENGTH[~TYP[2]]; ~SYM[3]=~SYM[3]+1) begin : ~GENSYM[foldr][4]~IF~SIZE[~TYP[2]]~THEN + localparam ~GENSYM[vec_index][8] = ~MAXINDEX[~TYP[2]] - ~SYM[3]; wire ~TYPEL[~TYP[2]] ~GENSYM[foldr_in1][5]; - assign ~SYM[5] = ~VAR[xs][2][(~LENGTH[~TYP[2]]-1-~SYM[3])*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI + assign ~SYM[5] = ~VAR[xs][2][(~SYM[8])*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI wire ~TYPO ~GENSYM[foldr_in2][6]; ~OUTPUTUSAGE[0] ~TYPO ~GENSYM[foldr_out][7]; diff --git a/clash-lib/src/Clash/Netlist/BlackBox/Util.hs b/clash-lib/src/Clash/Netlist/BlackBox/Util.hs index 1c01d0bfbd..1ddfd5904c 100644 --- a/clash-lib/src/Clash/Netlist/BlackBox/Util.hs +++ b/clash-lib/src/Clash/Netlist/BlackBox/Util.hs @@ -897,7 +897,9 @@ renderTag b (Depth e) = return . Text.pack . show . treeDepth $ lineToType b [e] renderTag b (MaxIndex e) = return . Text.pack . show . vecLen $ lineToType b [e] where vecLen (Vector n _) = n-1 + vecLen (Void (Just (Vector n _))) = n-1 vecLen (MemBlob n _) = n-1 + vecLen (Void (Just (MemBlob n _))) = n-1 vecLen thing = error $ $(curLoc) ++ "vecLen of a non-vector-like type: " ++ show thing