Mi experiencia es en software y soy nuevo en (Sistema) Verilog, así que cuando tengo la tarea de implementar un cambio de caesar (desplazar cada letra en una cadena con N letras, envolviéndolo si es necesario, por ejemplo, ABCXYZ desplazado por 3 se convierte en DEFABC), Escribí lo siguiente, con la esperanza de poder reducir la duplicación de código, como lo haría en el software:
/* every variable except 'direction' has the type 'byte' */
always_comb
begin
shifted_char = fresh_char; /* don't touch bytes that aren't letters */
is_lower_case = "z" >= fresh_char && fresh_char >= "a";
is_upper_case = "Z" >= fresh_char && fresh_char >= "A";
if (is_lower_case || is_upper_case)
begin
unique if (is_lower_case)
alphabet_start = "a";
else if (is_upper_case)
alphabet_start = "A";
alphabet_position = fresh_char - alphabet_start;
if (direction == "f") /* direction is a module parameter: f for forwards results in a shifter, any other value results in an 'unshifter' */
new_alphabet_position = (26 + (alphabet_position + shift_by)) % 26;
else
new_alphabet_position = (26 + (alphabet_position - shift_by)) % 26;
shifted_char = new_alphabet_position + alphabet_start;
end
end
Mi pregunta es (asumiendo que es un desplazador hacia adelante): con respecto a la parte "% 26", ¿puedo esperar que el sintetizador deduzca que el rango de valores posibles que va a llegar a ese punto es [26, 26 + 25 +? 25] ([26, 76]) y, por lo tanto, solo hay 2 casos que la lógica debe distinguir entre (> 26 y > 52), en lugar de [lo que sea la llamada inteligente cuando se manejan todas las 256 entradas posibles ”(sería ¿Sería considerar los casos > 26, > 52, > 78 etc ...? ¿O hay una mejor manera? Estoy divagando ...)]?
Siempre podría hacer lo siguiente:
new_alphabet_position = alphabet_position + shift_by;
if (new_alphabet_position > 25)
new_alpahbet_position -= 26;
/* Or, for the reverse shifter: */
new_alphabet_position = alphabet_position - shift_by;
if (new_alphabet_position < 0)
new_alpahbet_position += 26;
... pero tenía curiosidad y quería preguntarle eso, así como uno relacionado (que espero que más personas puedan responder): ¿Se puede usar para hacer un contador normal sin poder de 2? (p.ej cuenta < = (cuenta + 1)% 6; )? Siguiendo la respuesta de hgleamon1 al siguiente hilo, parece que (al menos una) la herramienta de sintetizador VHDL podría interpretarlo como se pretende: enlace