Design a financial instrument symbol hash using the FNV-1a algorithm.

Module name: symbol_hash
Parameters:
  - HASH_WIDTH = 16  // Output hash width in bits (8, 12, or 16)

Ports:
  - input                        clk
  - input                        rst_n        // Active-low synchronous reset
  - input  [7:0]                 char_in      // Input character (ASCII byte)
  - input                        char_valid   // High when char_in is valid
  - input                        char_last    // Marks last character of symbol string
  - output [HASH_WIDTH-1:0]      hash_out     // Hash value (lower HASH_WIDTH bits)
  - output                       hash_valid   // High for one cycle when hash_out is valid

Functional specification:
  - Implements FNV-1a hash with 32-bit internal state
  - FNV offset basis: 2166136261 (32'h811C9DC5)
  - FNV prime: 16777619 (32'h01000193)
  - For each input byte: hash = (hash XOR byte) * FNV_prime
  - Multiplication by FNV_prime uses shift-add decomposition (no hardware multiplier):
    x * 16777619 = (x<<24) + (x<<8) + (x<<7) + (x<<4) + (x<<1) + x
  - Process one character per clock cycle when char_valid is asserted
  - When char_last is asserted alongside char_valid, incorporate the final character,
    output hash_out = internal_hash[HASH_WIDTH-1:0], assert hash_valid for one cycle,
    and reset internal state for the next symbol
  - hash_valid is 0 at all other times
  - On rst_n, clear internal hash state to offset basis
  - Hashes must be deterministic: same input always produces same output
