Вот код матрицы на Verilog
Код:
module vm2_plb_model
(
input [13:0] rq,
output sp
);
wire [19:0] p;
function cmp
(
input [13:0] ai,
input [13:0] mi
);
begin
casex(ai)
mi: cmp = 1'b1;
default: cmp = 1'b0;
endcase
end
endfunction
assign p[0] = cmp(rq[13:0], 14'b111x1xx0000100);
assign p[1] = cmp(rq[13:0], 14'bx1000xx00001x0);
assign p[2] = cmp(rq[13:0], 14'b110xxxx1000000);
assign p[3] = cmp(rq[13:0], 14'bx1101xx0000110);
assign p[4] = cmp(rq[13:0], 14'b11xx1xx1000101);
assign p[5] = cmp(rq[13:0], 14'b11xxxxx0000001);
assign p[6] = cmp(rq[13:0], 14'bx1x0xxx0000010);
assign p[7] = cmp(rq[13:0], 14'bx1x0x0x1000010);
assign p[8] = cmp(rq[13:0], 14'b11xx0xx1000100);
assign p[9] = cmp(rq[13:0], 14'b11xxx1x1000x11);
assign p[10] = cmp(rq[13:0], 14'b110x0xx0000100);
assign p[11] = cmp(rq[13:0], 14'b110x1xx00001x1);
assign p[12] = cmp(rq[13:0], 14'b11xxx0x1000110);
assign p[13] = cmp(rq[13:0], 14'b111x0xx00001x1);
assign p[14] = cmp(rq[13:0], 14'b111xxxx1000001);
assign p[15] = cmp(rq[13:0], 14'b10xxxx0xxxxxxx);
assign p[16] = cmp(rq[13:0], 14'b11x1xxx0000x11);
assign p[17] = cmp(rq[13:0], 14'b01x0xxxxxxxxxx);
assign p[18] = cmp(rq[13:0], 14'b11x1xxxx000011);
assign p[19] = cmp(rq[13:0], 14'b000xxxxxxxxxxx);
assign sp = ~|p[19:0];
endmodule
Вот прототип функции на С без векторных инструкций:
Код:
#define cmp(x, value, mask) !((x) ^ (values)) & (mask)
unsigned int vm2_plb(unsigned int rq)
{
return !(cmp(rq, 0b11101000000100, 0b11101001111111) ||
...
cmp(rq, 0b11101000000100, 0b11101001111111));
}
Как только какой-то cmp() выдаст совпадение - вычисление прекратиться. При наличии SSE2 cmp() можно делать не 20 раз по 14 бит, а сразу вломить одним 512 битным.
PS. Камрады, а вам не кажется что ВМ2 тут оффтопик? И потом - эти посты тут будет сложновато найти.