property_get / property_set

本文深入探讨了Android系统中用于管理系统属性的机制,包括属性的读取、设置及内部实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Andorid 4.1.2


system/core/libcutils/properties.c

int property_set(const char *key, const char *value)
{
    return __system_property_set(key, value);
}


int property_get(const char *key, char *value, const char *default_value)
{
    int len;


    len = __system_property_get(key, value);

    if(len > 0) {
        return len;
    }   
    
    if(default_value) {   // default value 为NULL, 刚不会对value 做任何改变
        len = strlen(default_value);
        memcpy(value, default_value, len + 1); 
    }   
    return len;
}


bionic/libc/bionic/system_properties.c

int __system_property_read(const prop_info *pi, char *name, char *value)
{
    unsigned serial, len;
    
    for(;;) {
        serial = pi->serial;
        while(SERIAL_DIRTY(serial)) {
            __futex_wait((volatile void *)&pi->serial, serial, 0); 
            serial = pi->serial;
        }   
        len = SERIAL_VALUE_LEN(serial);
        memcpy(value, pi->value, len + 1); 
        if(serial == pi->serial) {
            if(name != 0) {
                strcpy(name, pi->name);
            }   
            return len;
        }   
    }   
}

int __system_property_get(const char *name, char *value)
{
    const prop_info *pi = __system_property_find(name);

    if(pi != 0) {
        return __system_property_read(pi, 0, value);
    } else {
        value[0] = 0;
        return 0;
    }   
}
int __system_property_set(const char *key, const char *value)
{
    int err;
    int tries = 0;
    int update_seen = 0;
    prop_msg msg;


    if(key == 0) {
        __libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : key = 0 \n");
        return -1;
    }
    if(value == 0) value = "";
    if(strlen(key) >= PROP_NAME_MAX) {
        __libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : strlen(key) >= %d, key = %s\n", PROP_NAME_MAX, key);
        return -2;
    }
    if(strlen(value) >= PROP_VALUE_MAX) {
        __libc_android_log_print(ANDROID_LOG_ERROR, "libc", "__system_property_set error : strlen(value) >= %d, value = %s \n", PROP_VALUE_MAX, value);
        return -3;
    }


    memset(&msg, 0, sizeof msg);
    msg.cmd = PROP_MSG_SETPROP;
    strlcpy(msg.name, key, sizeof msg.name);
    strlcpy(msg.value, value, sizeof msg.value);


    err = send_prop_msg(&msg);
    if(err < 0) {
        return err;
    }


    return 0;
}




这段代码的意义:#---------------- LOC ------------------- set_property LOC IDELAYCTRL_X0Y5 [get_cells -hierarchical -filter {NAME =~ *loop_IDELAYCTRL[0].inst_IDELAYCTRL}] set_property LOC IDELAYCTRL_X0Y6 [get_cells -hierarchical -filter {NAME =~ *loop_IDELAYCTRL[1].inst_IDELAYCTRL}] set_property LOC IDELAYCTRL_X0Y4 [get_cells -hierarchical -filter {NAME =~ *loop_IDELAYCTRL[2].inst_IDELAYCTRL}] set_property LOC IDELAYCTRL_X0Y1 [get_cells -hierarchical -filter {NAME =~ *loop_IDELAYCTRL[3].inst_IDELAYCTRL}] set_property LOC IDELAY_X0Y274 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[0].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y222 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[1].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y280 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[2].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y228 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[3].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y246 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[4].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y242 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[5].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y262 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[6].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y230 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[7].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y296 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[8].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y266 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[9].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y236 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[10].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y282 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[11].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y284 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[12].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y286 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[13].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y272 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_COUT[14].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y294 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[0].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y290 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[1].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y334 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[2].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y344 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[3].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y342 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[4].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y348 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[5].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y304 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[6].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y312 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[7].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y308 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[8].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y314 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[9].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y336 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[10].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y302 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[11].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y326 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[12].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y346 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[13].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y316 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_COUT[14].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y208 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[0].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y206 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[1].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y218 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[2].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y204 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[3].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y224 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[4].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y210 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[5].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y240 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[6].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y238 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[7].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y202 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[8].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y232 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[9].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y216 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[10].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y220 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[11].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y214 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[12].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y212 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[13].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y244 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_COUT[14].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y84 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[0].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y76 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[1].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y96 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[2].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y90 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[3].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y80 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[4].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y88 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[5].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y82 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[6].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y62 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[7].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y72 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[8].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y56 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[9].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y54 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[10].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y58 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[11].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y92 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[12].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y98 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[13].inst_Serdes/IDELAYE2_inst}] set_property LOC IDELAY_X0Y60 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_COUT[14].inst_Serdes/IDELAYE2_inst}] set_property LOC ILOGIC_X0Y274 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[0].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y222 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[1].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y280 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[2].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y228 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[3].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y246 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[4].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y242 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[5].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y262 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[6].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y230 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[7].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y296 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[8].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y266 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[9].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y236 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[10].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y282 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[11].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y284 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[12].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y286 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_DATA[13].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y272 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TL/Loop_Serdes_COUT[14].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y294 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[0].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y290 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[1].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y334 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[2].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y344 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[3].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y342 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[4].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y348 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[5].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y304 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[6].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y312 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[7].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y308 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[8].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y314 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[9].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y336 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[10].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y302 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[11].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y326 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[12].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y346 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_DATA[13].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y316 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_TR/Loop_Serdes_COUT[14].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y208 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[0].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y206 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[1].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y218 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[2].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y204 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[3].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y224 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[4].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y210 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[5].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y240 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[6].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y238 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[7].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y202 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[8].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y232 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[9].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y216 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[10].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y220 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[11].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y214 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[12].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y212 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_DATA[13].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y244 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BL/Loop_Serdes_COUT[14].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y84 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[0].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y76 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[1].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y96 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[2].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y90 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[3].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y80 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[4].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y88 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[5].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y82 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[6].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y62 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[7].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y72 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[8].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y56 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[9].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y54 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[10].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y58 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[11].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y92 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[12].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y98 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_DATA[13].inst_Serdes/IDDR_inst}] set_property LOC ILOGIC_X0Y60 [get_cells -hierarchical -filter {NAME =~ *inst_Serdes_Top_BR/Loop_Serdes_COUT[14].inst_Serdes/IDDR_inst}]
最新发布
08-20
<think>我们分析这段代码:它是Xilinx FPGA设计中的位置约束(LOC约束),用于将设计中的特定实例锁定到FPGA芯片上的特定位置。 代码中使用了两种类型的资源:IDELAYCTRL(延迟控制单元)、IDELAY(可编程延迟单元)和ILOGIC(输入逻辑单元,如IDDR)。 代码结构: set_property LOC <位置> [get_cells -hierarchical -filter {<匹配条件>}] 其中: - LOC: 指定位置约束的属性。 - <位置>: 例如IDELAYCTRL_X0Y5,表示FPGA上特定的坐标位置。 - get_cells: 获取设计中的单元(cells)。 - -hierarchical: 表示在设计的各个层次中搜索。 - -filter: 使用条件过滤出特定的单元实例。 匹配条件: - 使用通配符匹配实例的完整名称。例如:*loop_IDELAYCTRL[0].inst_IDELAYCTRL 这段代码的意义: 将设计中的IDELAYCTRL、IDELAY和ILOGIC(具体为IDDR)实例分配到FPGA芯片的特定物理位置。 为什么需要这样做? 1. 时序要求:高速接口需要精确控制延迟,固定位置可以保证时序可重复性。 2. 布局要求:某些资源(如IDELAYCTRL)必须放置在特定位置才能正常工作。 3. 避免布线拥塞:手动布局关键资源可以优化布局布线结果。 4. 引脚约束:与FPGA引脚位置相关的逻辑需要固定位置。 具体分析: 第一部分:IDELAYCTRL约束 将4个IDELAYCTRL实例分别约束到位置:X0Y5, X0Y6, X0Y4, X0Y1。 第二部分:IDELAY约束 分为四个区域(TL: 左上,TR: 右上,BL: 左下,BR: 右下),每个区域有15个数据通道(索引0到13)和1个COUT通道(索引14)。 每个通道的IDELAYE2实例被约束到特定的位置(如X0Y274等)。 第三部分:ILOGIC(IDDR)约束 同样分为四个区域,每个区域的每个通道的IDDR实例被约束到与IDELAY相同的位置(因为ILOGIC和IDELAY通常在同一位置,属于同一个IOB)。 注意: - 位置坐标中的X和Y表示FPGA芯片上的物理坐标。 - 每个区域(TL, TR, BL, BR)对应FPGA的一个I/O bank区域。 总结: 这段代码是FPGA设计中对高速串行接口(Serdes)的输入延迟控制单元、延迟单元和输入双数据速率寄存器进行位置约束,确保物理布局满足时序和电气要求。 相关问题:</think>### 代码解析:Xilinx FPGA 位置约束(LOC)设置 这段代码是 **Xilinx FPGA 设计中的位置约束(LOC)设置**,用于在 Vivado 设计工具中指定硬件资源在 FPGA 芯片上的物理位置。以下是关键解析: #### 1. **核心语法结构** ```tcl set_property LOC <物理位置> [get_cells -hierarchical -filter {NAME =~ <实例路径>}] ``` - `LOC`:位置约束属性 - `get_cells`:获取设计中的单元实例 - `-hierarchical`:跨层次搜索实例 - `-filter`:使用正则表达式匹配实例路径 #### 2. **约束目标分类** | 资源类型 | 功能描述 | 示例位置 | |------------------|-----------------------------------|----------------| | **IDELAYCTRL** | 延迟校准控制单元 | `IDELAYCTRL_X0Y5` | | **IDELAY** | 可编程输入延迟单元 | `IDELAY_X0Y274` | | **ILOGIC** | 输入逻辑资源(含 IDDR 双沿触发器) | `ILOGIC_X0Y274` | #### 3. **设计架构分析** 代码管理 **4 个 SerDes 模块**(高速串行接口): ```tcl inst_Serdes_Top_TL # 左上区域 inst_Serdes_Top_TR # 右上区域 inst_Serdes_Top_BL # 左下区域 inst_Serdes_Top_BR # 右下区域 ``` 每个模块包含: - 15 个数据通道(`DATA[0]` 到 `DATA[13]`) - 1 个控制输出通道(`COUT[14]`) #### 4. **关键设计模式** ```tcl # 延迟单元 + 输入逻辑的配对约束 set_property LOC IDELAY_X0Y274 [get_cells ...IDELAYE2_inst] set_property LOC ILOGIC_X0Y274 [get_cells ...IDDR_inst] ``` **物理布局原则**: 将 `IDELAYE2` 和 `IDDR` 配对放置在同一位置(Y坐标相同),确保信号路径最短,满足高速时序要求。 ### 设计目的与意义 1. **时序优化** 精确控制输入延迟(IDELAY)和时钟-数据对齐(IDDR),解决高速信号(如 DDR 接口)的时序收敛问题。 2. **布局控制** 避免自动布局工具(P&R)将关键资源分散放置,导致布线延迟不一致。 3. **信号完整性** 通过对称布局(TL/TR/BL/BR 四区域),平衡各通道的走线长度和负载。 4. **资源分配** 确保每个 SerDes 通道独占专用的物理资源,避免资源冲突。 ### 典型应用场景 - 高速 ADC/DAC 接口 - DDR 内存控制器 - 千兆以太网 PHY - 摄像头 MIPI 接口 - 高速串行通信(如 JESD204B)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值